<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Flow-IPC: transport/bipc_mq_handle.cpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr id="projectrow">
  <td id="projectalign">
   <div id="projectname">Flow-IPC<span id="projectnumber">&#160;2.0.0</span>
   </div>
   <div id="projectbrief">Flow-IPC project: Full implementation reference.</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div id="nav-path" class="navpath">
  <ul>
<li class="navelem"><a class="el" href="dir_0c017496b493ff066fbbe686970307ba.html">transport</a></li>  </ul>
</div>
</div><!-- top -->
<div class="header">
  <div class="headertitle"><div class="title">bipc_mq_handle.cpp</div></div>
</div><!--header-->
<div class="contents">
<a href="bipc__mq__handle_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno">    1</span><span class="comment">/* Flow-IPC: Core</span></div>
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno">    2</span><span class="comment"> * Copyright 2023 Akamai Technologies, Inc.</span></div>
<div class="line"><a id="l00003" name="l00003"></a><span class="lineno">    3</span><span class="comment"> *</span></div>
<div class="line"><a id="l00004" name="l00004"></a><span class="lineno">    4</span><span class="comment"> * Licensed under the Apache License, Version 2.0 (the</span></div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno">    5</span><span class="comment"> * &quot;License&quot;); you may not use this file except in</span></div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno">    6</span><span class="comment"> * compliance with the License.  You may obtain a copy</span></div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno">    7</span><span class="comment"> * of the License at</span></div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno">    8</span><span class="comment"> *</span></div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno">    9</span><span class="comment"> *   https://www.apache.org/licenses/LICENSE-2.0</span></div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno">   10</span><span class="comment"> *</span></div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno">   11</span><span class="comment"> * Unless required by applicable law or agreed to in</span></div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno">   12</span><span class="comment"> * writing, software distributed under the License is</span></div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno">   13</span><span class="comment"> * distributed on an &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR</span></div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno">   14</span><span class="comment"> * CONDITIONS OF ANY KIND, either express or implied.</span></div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno">   15</span><span class="comment"> * See the License for the specific language governing</span></div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno">   16</span><span class="comment"> * permissions and limitations under the License. */</span></div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno">   17</span><span class="comment"></span> </div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno">   18</span><span class="comment">/// @file</span></div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno">   19</span><span class="comment"></span><span class="preprocessor">#include &quot;<a class="code" href="transport__fwd_8hpp.html">ipc/transport/transport_fwd.hpp</a>&quot;</span></div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno">   20</span><span class="preprocessor">#include &quot;<a class="code" href="bipc__mq__handle_8hpp.html">ipc/transport/bipc_mq_handle.hpp</a>&quot;</span></div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno">   21</span><span class="preprocessor">#include &quot;<a class="code" href="ipc__core_2src_2ipc_2transport_2error_8hpp.html">ipc/transport/error.hpp</a>&quot;</span></div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno">   22</span><span class="preprocessor">#include &lt;flow/error/error.hpp&gt;</span></div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno">   23</span><span class="preprocessor">#include &lt;flow/common.hpp&gt;</span></div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno">   24</span><span class="preprocessor">#include &lt;boost/interprocess/ipc/message_queue.hpp&gt;</span></div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno">   25</span><span class="preprocessor">#include &lt;boost/move/make_unique.hpp&gt;</span></div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno">   26</span> </div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno">   27</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespaceipc_1_1transport.html">ipc::transport</a></div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno">   28</span>{</div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno">   29</span> </div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno">   30</span><span class="comment">// Initializers.</span></div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno">   31</span> </div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno">   32</span><span class="keyword">const</span> <a class="code hl_typedef" href="namespaceipc_1_1transport.html#a33de1c256addb3964b839dc2dd407d24">Shared_name</a> <a class="code hl_variable" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a76ef929399fb9a7b4cec9ebb4d2ad6f0">Bipc_mq_handle::S_RESOURCE_TYPE_ID</a> = <a class="code hl_function" href="classipc_1_1util_1_1Shared__name.html#a48f20b7b54490aa10dc64081d34c55b2">Shared_name::ct</a>(<span class="stringliteral">&quot;bipcQ&quot;</span>);</div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno">   33</span> </div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno">   34</span><span class="comment">// Implementations.</span></div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno">   35</span> </div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno">   36</span><a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a0022f89e50cc522971cac3eb12025924">Bipc_mq_handle::Bipc_mq_handle</a>() = <span class="keywordflow">default</span>;</div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno">   37</span> </div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno">   38</span><span class="keyword">template</span>&lt;<span class="keyword">typename</span> Mode_tag&gt;</div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a09f47c6b083179259b7a21b1a6f3c6d0">   39</a></span><a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a0022f89e50cc522971cac3eb12025924">Bipc_mq_handle::Bipc_mq_handle</a>(Mode_tag mode_tag, flow::log::Logger* logger_ptr, <span class="keyword">const</span> <a class="code hl_class" href="classipc_1_1util_1_1Shared__name.html">Shared_name</a>&amp; absolute_name_arg,</div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno">   40</span>                               <span class="keywordtype">size_t</span> max_n_msg, <span class="keywordtype">size_t</span> max_msg_sz,</div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno">   41</span>                               <span class="keyword">const</span> <a class="code hl_typedef" href="namespaceipc_1_1util.html#a1b398ae730d1e6040687cb2397115152">util::Permissions</a>&amp; perms,</div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno">   42</span>                               <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code) :</div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno">   43</span>  flow::log::Log_context(logger_ptr, <a class="code hl_enumeration" href="namespaceipc.html#a4ccdeed058222c635745a4dc830e99f7">Log_component</a>::S_TRANSPORT),</div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno">   44</span>  m_absolute_name(absolute_name_arg),</div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno">   45</span>  m_interrupting_snd(false),</div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno">   46</span>  m_interrupting_rcv(false)</div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno">   47</span>{</div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno">   48</span>  <span class="keyword">using </span>flow::log::Sev;</div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno">   49</span>  <span class="keyword">using </span>boost::io::ios_all_saver;</div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno">   50</span>  <span class="keyword">using </span>boost::movelib::make_unique;</div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno">   51</span>  <span class="keyword">using </span>bipc::message_queue;</div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno">   52</span> </div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno">   53</span>  assert(max_n_msg &gt;= 1);</div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno">   54</span>  assert(max_msg_sz &gt;= 1);</div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno">   55</span> </div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno">   56</span>  <span class="keyword">static_assert</span>(std::is_same_v&lt;Mode_tag, util::Create_only&gt; || std::is_same_v&lt;Mode_tag, util::Open_or_create&gt;,</div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno">   57</span>                <span class="stringliteral">&quot;Can only delegate to this ctor with Mode_tag = Create_only or Open_or_create.&quot;</span>);</div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno">   58</span>  <span class="keyword">constexpr</span> <span class="keywordtype">char</span> <span class="keyword">const</span> * MODE_STR = std::is_same_v&lt;Mode_tag, util::Create_only&gt;</div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno">   59</span>                                      ? <span class="stringliteral">&quot;create-only&quot;</span> : <span class="stringliteral">&quot;open-or-create&quot;</span>;</div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno">   60</span> </div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno">   61</span>  <span class="keywordflow">if</span> (get_logger()-&gt;should_log(Sev::S_TRACE, get_log_component()))</div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno">   62</span>  {</div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno">   63</span>    ios_all_saver saver(*(get_logger()-&gt;this_thread_ostream())); <span class="comment">// Revert std::oct/etc. soon.</span></div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno">   64</span>    FLOW_LOG_TRACE_WITHOUT_CHECKING</div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno">   65</span>      (<span class="stringliteral">&quot;Bipc_mq_handle [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Constructing MQ handle to MQ at name [&quot;</span> &lt;&lt; <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a7263ed9ec4f8ed534c0f7907b7accde9">absolute_name</a>() &lt;&lt; <span class="stringliteral">&quot;] in &quot;</span></div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno">   66</span>       <span class="stringliteral">&quot;[&quot;</span> &lt;&lt; MODE_STR &lt;&lt; <span class="stringliteral">&quot;] mode; max msg size [&quot;</span> &lt;&lt; max_msg_sz &lt;&lt; <span class="stringliteral">&quot;] x [&quot;</span> &lt;&lt; max_n_msg &lt;&lt; <span class="stringliteral">&quot;] msgs; &quot;</span></div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno">   67</span>       <span class="stringliteral">&quot;perms = [&quot;</span> &lt;&lt; std::setfill(<span class="charliteral">&#39;0&#39;</span>) &lt;&lt; std::setw(4) &lt;&lt; std::oct &lt;&lt; perms.get_permissions() &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno">   68</span>  }</div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno">   69</span> </div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno">   70</span>  <span class="comment">/* m_mq is null.  Try to create/create-or-open it; it may throw exception; this will do the right thing including</span></div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno">   71</span><span class="comment">   * leaving m_mq at null, as promised, on any error.  Note we might throw exception because of this call. */</span></div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno">   72</span>  <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a9948742d87298d5842d298de9c946c7c">op_with_possible_bipc_mq_exception</a>(err_code, <span class="stringliteral">&quot;Bipc_mq_handle(): bipc::message_queue()&quot;</span>,</div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno">   73</span>                                     [&amp;]()</div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno">   74</span>  {</div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno">   75</span>    <a class="code hl_variable" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a152b99bc327c774553e9b90a5f0bc4d3">m_mq</a> = make_unique&lt;message_queue&gt;(mode_tag, <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a7263ed9ec4f8ed534c0f7907b7accde9">absolute_name</a>().native_str(), max_n_msg, max_msg_sz, perms);</div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno">   76</span>    <span class="comment">/* Bonus: All bipc CREATE/OPEN_OR_CREATE guys take care to ensure permissions are set regardless of umask,</span></div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno">   77</span><span class="comment">     * so no need for us to set_resource_permissions() here. */</span></div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno">   78</span>  });</div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno">   79</span>} <span class="comment">// Bipc_mq_handle::Bipc_mq_handle(Mode_tag)</span></div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno">   80</span> </div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a11941ad5d1a6d0cef286a69ed99bb2d0">   81</a></span><a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a0022f89e50cc522971cac3eb12025924">Bipc_mq_handle::Bipc_mq_handle</a>(flow::log::Logger* logger_ptr, <span class="keyword">const</span> <a class="code hl_class" href="classipc_1_1util_1_1Shared__name.html">Shared_name</a>&amp; absolute_name_arg,</div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno">   82</span>                               <a class="code hl_typedef" href="namespaceipc_1_1util.html#a9d84c2bab504e6de32b20c77ca9723a2">util::Create_only</a>, <span class="keywordtype">size_t</span> max_n_msg, <span class="keywordtype">size_t</span> max_msg_sz,</div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno">   83</span>                               <span class="keyword">const</span> <a class="code hl_typedef" href="namespaceipc_1_1util.html#a1b398ae730d1e6040687cb2397115152">util::Permissions</a>&amp; perms, <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code) :</div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno">   84</span>  <a class="code hl_class" href="classipc_1_1transport_1_1Bipc__mq__handle.html">Bipc_mq_handle</a>(util::<a class="code hl_variable" href="namespaceipc_1_1util.html#ad1ca1cab79a35e1eb1c47037a0973cd8">CREATE_ONLY</a>, logger_ptr, absolute_name_arg, max_n_msg, max_msg_sz, perms, err_code)</div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno">   85</span>{</div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno">   86</span>  <span class="comment">// Cool.</span></div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno">   87</span>}</div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno">   88</span> </div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a8fc57150cd7b7223b5f75b187bc7406f">   89</a></span><a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a0022f89e50cc522971cac3eb12025924">Bipc_mq_handle::Bipc_mq_handle</a>(flow::log::Logger* logger_ptr, <span class="keyword">const</span> <a class="code hl_class" href="classipc_1_1util_1_1Shared__name.html">Shared_name</a>&amp; absolute_name_arg,</div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno">   90</span>                               <a class="code hl_typedef" href="namespaceipc_1_1util.html#a9571de958538d7a4a8649bbfecfac0b9">util::Open_or_create</a>, <span class="keywordtype">size_t</span> max_n_msg, <span class="keywordtype">size_t</span> max_msg_sz,</div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno">   91</span>                               <span class="keyword">const</span> <a class="code hl_typedef" href="namespaceipc_1_1util.html#a1b398ae730d1e6040687cb2397115152">util::Permissions</a>&amp; perms, <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code) :</div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno">   92</span>  <a class="code hl_class" href="classipc_1_1transport_1_1Bipc__mq__handle.html">Bipc_mq_handle</a>(util::<a class="code hl_variable" href="namespaceipc_1_1util.html#a5664539b3d75d6d10cdfebf6eac5382d">OPEN_OR_CREATE</a>, logger_ptr, absolute_name_arg, max_n_msg, max_msg_sz, perms, err_code)</div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno">   93</span>{</div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno">   94</span>  <span class="comment">// Cool.</span></div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno">   95</span>}</div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno">   96</span> </div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a65748d60779863c62808478340bfb142">   97</a></span><a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a0022f89e50cc522971cac3eb12025924">Bipc_mq_handle::Bipc_mq_handle</a>(flow::log::Logger* logger_ptr, <span class="keyword">const</span> <a class="code hl_class" href="classipc_1_1util_1_1Shared__name.html">Shared_name</a>&amp; absolute_name_arg,</div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno">   98</span>                               <a class="code hl_typedef" href="namespaceipc_1_1util.html#a3e03491b5b2b5fac26551a220946d6e5">util::Open_only</a>, <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code) :</div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno">   99</span>  flow::log::Log_context(logger_ptr, <a class="code hl_enumeration" href="namespaceipc.html#a4ccdeed058222c635745a4dc830e99f7">Log_component</a>::S_TRANSPORT),</div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno">  100</span>  m_absolute_name(absolute_name_arg),</div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno">  101</span>  m_interrupting_snd(false),</div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno">  102</span>  m_interrupting_rcv(false)</div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno">  103</span>{</div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno">  104</span>  <span class="keyword">using </span>boost::movelib::make_unique;</div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno">  105</span>  <span class="keyword">using </span>bipc::message_queue;</div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno">  106</span> </div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno">  107</span>  FLOW_LOG_TRACE(<span class="stringliteral">&quot;Bipc_mq_handle [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Constructing MQ handle to MQ at name &quot;</span></div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno">  108</span>                 <span class="stringliteral">&quot;[&quot;</span> &lt;&lt; <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a7263ed9ec4f8ed534c0f7907b7accde9">absolute_name</a>() &lt;&lt; <span class="stringliteral">&quot;] in open-only mode.&quot;</span>);</div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno">  109</span> </div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno">  110</span>  <span class="comment">/* m_mq is null.  Try to create it; it may throw exception; this will do the right thing including</span></div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno">  111</span><span class="comment">   * leaving m_mq at null, as promised, on any error.  Note we might throw exception because of this call. */</span></div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno">  112</span>  <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a9948742d87298d5842d298de9c946c7c">op_with_possible_bipc_mq_exception</a>(err_code,  <span class="stringliteral">&quot;Bipc_mq_handle(): bipc::message_queue(OPEN_ONLY)&quot;</span>,</div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno">  113</span>                                     [&amp;]()</div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno">  114</span>  {</div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno">  115</span>    <a class="code hl_variable" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a152b99bc327c774553e9b90a5f0bc4d3">m_mq</a> = make_unique&lt;message_queue&gt;(<a class="code hl_variable" href="namespaceipc_1_1util.html#a6a3a6ec85242d073df96978c63464078">util::OPEN_ONLY</a>, <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a7263ed9ec4f8ed534c0f7907b7accde9">absolute_name</a>().native_str());</div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno">  116</span>  });</div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno">  117</span>} <span class="comment">// Bipc_mq_handle::Bipc_mq_handle(Open_only)</span></div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno">  118</span> </div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno">  119</span><span class="comment">// Just move-construct m_mq, m_absolute_name, and Log_holder.</span></div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno">  120</span><a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a0022f89e50cc522971cac3eb12025924">Bipc_mq_handle::Bipc_mq_handle</a>(<a class="code hl_class" href="classipc_1_1transport_1_1Bipc__mq__handle.html">Bipc_mq_handle</a>&amp;&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno">  121</span> </div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Bipc__mq__handle.html#abe6cb3e8131f26c250c4b623d3fa2afe">  122</a></span><a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#abe6cb3e8131f26c250c4b623d3fa2afe">Bipc_mq_handle::~Bipc_mq_handle</a>()</div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno">  123</span>{</div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno">  124</span>  FLOW_LOG_TRACE(<span class="stringliteral">&quot;Bipc_mq_handle [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Closing MQ handle (already null? = [&quot;</span> &lt;&lt; (!<a class="code hl_variable" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a152b99bc327c774553e9b90a5f0bc4d3">m_mq</a>) &lt;&lt; <span class="stringliteral">&quot;]).&quot;</span>);</div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno">  125</span>}</div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno">  126</span> </div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno">  127</span><span class="comment">// Just do m_mq = std::move(src.m_mq) and same with m_absolute_name and Log_holder.</span></div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno">  128</span><a class="code hl_class" href="classipc_1_1transport_1_1Bipc__mq__handle.html">Bipc_mq_handle</a>&amp; <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a1a94d32b8a1bc93d19b19a0da35cd062">Bipc_mq_handle::operator=</a>(<a class="code hl_class" href="classipc_1_1transport_1_1Bipc__mq__handle.html">Bipc_mq_handle</a>&amp;&amp; src) = <span class="keywordflow">default</span>;</div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno">  129</span> </div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Bipc__mq__handle.html#af0610dff5efd418a8ff393f0ad9dd5c2">  130</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="namespaceipc_1_1transport.html#af0610dff5efd418a8ff393f0ad9dd5c2">swap</a>(<a class="code hl_class" href="classipc_1_1transport_1_1Bipc__mq__handle.html">Bipc_mq_handle</a>&amp; val1, <a class="code hl_class" href="classipc_1_1transport_1_1Bipc__mq__handle.html">Bipc_mq_handle</a>&amp; val2)</div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno">  131</span>{</div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno">  132</span>  <span class="keyword">using </span>flow::log::Log_context;</div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno">  133</span>  <span class="keyword">using </span><a class="code hl_function" href="namespaceipc_1_1transport.html#af0610dff5efd418a8ff393f0ad9dd5c2">std::swap</a>;</div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno">  134</span> </div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno">  135</span>  <span class="comment">// This is a bit faster than un-specialized std::swap() which would require a move ction + 2 move assignments.</span></div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno">  136</span> </div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno">  137</span>  <a class="code hl_function" href="namespaceipc_1_1transport.html#af0610dff5efd418a8ff393f0ad9dd5c2">swap</a>(<span class="keyword">static_cast&lt;</span>Log_context&amp;<span class="keyword">&gt;</span>(val1), <span class="keyword">static_cast&lt;</span>Log_context&amp;<span class="keyword">&gt;</span>(val2));</div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno">  138</span>  <a class="code hl_function" href="namespaceipc_1_1transport.html#af0610dff5efd418a8ff393f0ad9dd5c2">swap</a>(val1.<a class="code hl_variable" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a152b99bc327c774553e9b90a5f0bc4d3">m_mq</a>, val2.<a class="code hl_variable" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a152b99bc327c774553e9b90a5f0bc4d3">m_mq</a>);</div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno">  139</span>  <a class="code hl_function" href="namespaceipc_1_1transport.html#af0610dff5efd418a8ff393f0ad9dd5c2">swap</a>(val1.<a class="code hl_variable" href="classipc_1_1transport_1_1Bipc__mq__handle.html#ade4351eeddc732c817af9a924780ba27">m_absolute_name</a>, val2.<a class="code hl_variable" href="classipc_1_1transport_1_1Bipc__mq__handle.html#ade4351eeddc732c817af9a924780ba27">m_absolute_name</a>);</div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno">  140</span>}</div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno">  141</span> </div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Bipc__mq__handle.html#ad8ef88d8e0a59b770c9d15d008b52a4b">  142</a></span><span class="keywordtype">size_t</span> <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#ad8ef88d8e0a59b770c9d15d008b52a4b">Bipc_mq_handle::max_msg_size</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno">  143</span><span class="keyword"></span>{</div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno">  144</span>  assert(<a class="code hl_variable" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a152b99bc327c774553e9b90a5f0bc4d3">m_mq</a> &amp;&amp; <span class="stringliteral">&quot;As advertised: max_msg_size() =&gt; undefined behavior if not successfully cted or was moved-from.&quot;</span>);</div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno">  145</span>  <span class="keywordflow">return</span> <a class="code hl_variable" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a152b99bc327c774553e9b90a5f0bc4d3">m_mq</a>-&gt;get_max_msg_size();</div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno">  146</span>} <span class="comment">// Bipc_mq_handle::max_msg_size()</span></div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno">  147</span> </div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a9f3318676f5e687f791088484d1bbef8">  148</a></span><span class="keywordtype">size_t</span> <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a9f3318676f5e687f791088484d1bbef8">Bipc_mq_handle::max_n_msgs</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno">  149</span><span class="keyword"></span>{</div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno">  150</span>  assert(<a class="code hl_variable" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a152b99bc327c774553e9b90a5f0bc4d3">m_mq</a> &amp;&amp; <span class="stringliteral">&quot;As advertised: max_n_msgs() =&gt; undefined behavior if not successfully cted or was moved-from.&quot;</span>);</div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno">  151</span>  <span class="keywordflow">return</span> <a class="code hl_variable" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a152b99bc327c774553e9b90a5f0bc4d3">m_mq</a>-&gt;get_max_msg();</div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno">  152</span>} <span class="comment">// Bipc_mq_handle::max_msg_size()</span></div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno">  153</span> </div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a4c3406cf8759017342ed295fcc833704">  154</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a4c3406cf8759017342ed295fcc833704">Bipc_mq_handle::try_send</a>(<span class="keyword">const</span> <a class="code hl_typedef" href="namespaceipc_1_1util.html#ae0be7edba7e30ffa3f8b742af621f2ab">util::Blob_const</a>&amp; blob, <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code)</div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno">  155</span>{</div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno">  156</span>  <span class="keyword">using </span>flow::util::buffers_dump_string;</div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno">  157</span> </div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno">  158</span>  FLOW_ERROR_EXEC_AND_THROW_ON_ERROR(<span class="keywordtype">bool</span>, <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a4c3406cf8759017342ed295fcc833704">try_send</a>, blob, _1);</div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno">  159</span>  <span class="comment">// ^-- Call ourselves and return if err_code is null.  If got to present line, err_code is not null.</span></div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno">  160</span> </div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno">  161</span>  assert(<a class="code hl_variable" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a152b99bc327c774553e9b90a5f0bc4d3">m_mq</a> &amp;&amp; <span class="stringliteral">&quot;As advertised: try_send() =&gt; undefined behavior if not successfully cted or was moved-from.&quot;</span>);</div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno">  162</span> </div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno">  163</span>  <span class="keywordtype">bool</span> not_blocked;</div>
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno">  164</span>  <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a9948742d87298d5842d298de9c946c7c">op_with_possible_bipc_mq_exception</a>(err_code, <span class="stringliteral">&quot;Bipc_mq_handle::try_send(): bipc::message_queue::try_send()&quot;</span>,</div>
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno">  165</span>                                     [&amp;]()</div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno">  166</span>  {</div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno">  167</span>    <span class="keyword">auto</span> <a class="code hl_function" href="namespaceipc_1_1util.html#a2bb38cee29dacbe56de5182221b45941">blob_data</a> = blob.data();</div>
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno">  168</span>    FLOW_LOG_TRACE(<span class="stringliteral">&quot;Bipc_mq_handle [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Nb-push of blob @[&quot;</span> &lt;&lt; <a class="code hl_function" href="namespaceipc_1_1util.html#a2bb38cee29dacbe56de5182221b45941">blob_data</a> &lt;&lt; <span class="stringliteral">&quot;], &quot;</span></div>
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno">  169</span>                   <span class="stringliteral">&quot;size [&quot;</span> &lt;&lt; blob.size() &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno">  170</span>    <span class="keywordflow">if</span> (blob.size() == 0)</div>
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno">  171</span>    {</div>
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno">  172</span>      <span class="comment">/* bipc::message_queue::try_send() invokes memcpy(X, nullptr, N), even when N == 0;</span></div>
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno">  173</span><span class="comment">       * which is (1) empirically speaking harmless but (2) technically in violation of arg 2&#39;s non-null decl</span></div>
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno">  174</span><span class="comment">       * hence (3) causes a clang UBSAN sanitizer error.  So waste a couple cycles by feeding it this dummy</span></div>
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno">  175</span><span class="comment">       * non-null value. */</span></div>
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno">  176</span>      <a class="code hl_function" href="namespaceipc_1_1util.html#a2bb38cee29dacbe56de5182221b45941">blob_data</a> = <span class="keyword">static_cast&lt;</span><span class="keyword">const </span><span class="keywordtype">void</span>*<span class="keyword">&gt;</span>(&amp;<a class="code hl_function" href="namespaceipc_1_1util.html#a2bb38cee29dacbe56de5182221b45941">blob_data</a>);</div>
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno">  177</span>    }</div>
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno">  178</span>    <span class="keywordflow">else</span> <span class="comment">// if (blob.size() != 0)</span></div>
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno">  179</span>    {</div>
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno">  180</span>      FLOW_LOG_DATA(<span class="stringliteral">&quot;Blob contents: [\n&quot;</span> &lt;&lt; buffers_dump_string(blob, <span class="stringliteral">&quot;  &quot;</span>) &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno">  181</span>    }</div>
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno">  182</span> </div>
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno">  183</span>    not_blocked</div>
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno">  184</span>      = <a class="code hl_variable" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a152b99bc327c774553e9b90a5f0bc4d3">m_mq</a>-&gt;try_send(<a class="code hl_function" href="namespaceipc_1_1util.html#a2bb38cee29dacbe56de5182221b45941">blob_data</a>, blob.size(), 0); <span class="comment">// Throws &lt;=&gt; error wrapper sets truthy *err_code.</span></div>
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno">  185</span>    <span class="keywordflow">if</span> (!not_blocked)</div>
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno">  186</span>    {</div>
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno">  187</span>      FLOW_LOG_TRACE(<span class="stringliteral">&quot;Bipc_mq_handle [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Nb-push of blob @[&quot;</span> &lt;&lt; <a class="code hl_function" href="namespaceipc_1_1util.html#a2bb38cee29dacbe56de5182221b45941">blob_data</a> &lt;&lt; <span class="stringliteral">&quot;], &quot;</span></div>
<div class="line"><a id="l00188" name="l00188"></a><span class="lineno">  188</span>                     <span class="stringliteral">&quot;size [&quot;</span> &lt;&lt; blob.size() &lt;&lt; <span class="stringliteral">&quot;]: would-block.&quot;</span>);</div>
<div class="line"><a id="l00189" name="l00189"></a><span class="lineno">  189</span>    }</div>
<div class="line"><a id="l00190" name="l00190"></a><span class="lineno">  190</span>  }); <span class="comment">// op_with_possible_bipc_mq_exception()</span></div>
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno">  191</span>  <span class="keywordflow">if</span> (*err_code) <span class="comment">// It logged if truthy.</span></div>
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno">  192</span>  {</div>
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno">  193</span>    <span class="keywordflow">return</span> <span class="keyword">false</span>; <span class="comment">// not_blocked is garbage.</span></div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno">  194</span>  }</div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno">  195</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno">  196</span> </div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno">  197</span>  <span class="keywordflow">return</span> not_blocked; <span class="comment">// Logged about it already.</span></div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno">  198</span>} <span class="comment">// Bipc_mq_handle::try_send()</span></div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno">  199</span> </div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a45e952a67d6568f6ef4834a3523a2ca4">  200</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a45e952a67d6568f6ef4834a3523a2ca4">Bipc_mq_handle::send</a>(<span class="keyword">const</span> <a class="code hl_typedef" href="namespaceipc_1_1util.html#ae0be7edba7e30ffa3f8b742af621f2ab">util::Blob_const</a>&amp; blob, <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code)</div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno">  201</span>{</div>
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno">  202</span>  <span class="keyword">using </span>flow::util::buffers_dump_string;</div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno">  203</span> </div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno">  204</span>  <span class="keywordflow">if</span> (flow::error::exec_void_and_throw_on_error</div>
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno">  205</span>        ([&amp;](<a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* actual_err_code) { <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a45e952a67d6568f6ef4834a3523a2ca4">send</a>(blob, actual_err_code); },</div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno">  206</span>         err_code, <span class="stringliteral">&quot;Bipc_mq_handle::send()&quot;</span>))</div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno">  207</span>  {</div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno">  208</span>    <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno">  209</span>  }</div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno">  210</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno">  211</span>  err_code-&gt;clear();</div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno">  212</span> </div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno">  213</span>  assert(<a class="code hl_variable" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a152b99bc327c774553e9b90a5f0bc4d3">m_mq</a> &amp;&amp; <span class="stringliteral">&quot;As advertised: send() =&gt; undefined behavior if not successfully cted or was moved-from.&quot;</span>);</div>
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno">  214</span> </div>
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno">  215</span>  <span class="keyword">auto</span> <a class="code hl_function" href="namespaceipc_1_1util.html#a2bb38cee29dacbe56de5182221b45941">blob_data</a> = blob.data();</div>
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno">  216</span>  FLOW_LOG_TRACE(<span class="stringliteral">&quot;Bipc_mq_handle [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Blocking-push of blob @[&quot;</span> &lt;&lt; <a class="code hl_function" href="namespaceipc_1_1util.html#a2bb38cee29dacbe56de5182221b45941">blob_data</a> &lt;&lt; <span class="stringliteral">&quot;], &quot;</span></div>
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno">  217</span>                 <span class="stringliteral">&quot;size [&quot;</span> &lt;&lt; blob.size() &lt;&lt; <span class="stringliteral">&quot;].  Trying nb-push first; if it succeeds -- great.  &quot;</span></div>
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno">  218</span>                 <span class="stringliteral">&quot;Else will wait/retry/wait/retry/....&quot;</span>);</div>
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno">  219</span>  <span class="keywordflow">if</span> (blob.size() == 0)</div>
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno">  220</span>  {</div>
<div class="line"><a id="l00221" name="l00221"></a><span class="lineno">  221</span>    <span class="comment">// See similarly-placed comment in try_send() which explains this.</span></div>
<div class="line"><a id="l00222" name="l00222"></a><span class="lineno">  222</span>    <a class="code hl_function" href="namespaceipc_1_1util.html#a2bb38cee29dacbe56de5182221b45941">blob_data</a> = <span class="keyword">static_cast&lt;</span><span class="keyword">const </span><span class="keywordtype">void</span>*<span class="keyword">&gt;</span>(&amp;<a class="code hl_function" href="namespaceipc_1_1util.html#a2bb38cee29dacbe56de5182221b45941">blob_data</a>);</div>
<div class="line"><a id="l00223" name="l00223"></a><span class="lineno">  223</span>  }</div>
<div class="line"><a id="l00224" name="l00224"></a><span class="lineno">  224</span>  <span class="keywordflow">else</span> <span class="comment">// if (blob.size() != 0)</span></div>
<div class="line"><a id="l00225" name="l00225"></a><span class="lineno">  225</span>  {</div>
<div class="line"><a id="l00226" name="l00226"></a><span class="lineno">  226</span>    FLOW_LOG_DATA(<span class="stringliteral">&quot;Blob contents: [\n&quot;</span> &lt;&lt; buffers_dump_string(blob, <span class="stringliteral">&quot;  &quot;</span>) &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00227" name="l00227"></a><span class="lineno">  227</span>  }</div>
<div class="line"><a id="l00228" name="l00228"></a><span class="lineno">  228</span> </div>
<div class="line"><a id="l00229" name="l00229"></a><span class="lineno">  229</span>  <span class="comment">/* We could just invoke blocking m_mq-&gt;send(), but to get the promised logging we go a tiny bit fancier as follows.</span></div>
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno">  230</span><span class="comment">   * Update: Now that we have to be interrupt_*()ible, also reuse wait_*() instead of using native</span></div>
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno">  231</span><span class="comment">   * m_mq-&gt;*(). */</span></div>
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno">  232</span> </div>
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno">  233</span>  <span class="keywordtype">bool</span> ok;</div>
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno">  234</span>  <span class="keywordflow">while</span> (<span class="keyword">true</span>)</div>
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno">  235</span>  {</div>
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno">  236</span>    <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a9948742d87298d5842d298de9c946c7c">op_with_possible_bipc_mq_exception</a>(err_code, <span class="stringliteral">&quot;Bipc_mq_handle::send(): bipc::message_queue::try_send()&quot;</span>,</div>
<div class="line"><a id="l00237" name="l00237"></a><span class="lineno">  237</span>                                       [&amp;]()</div>
<div class="line"><a id="l00238" name="l00238"></a><span class="lineno">  238</span>    {</div>
<div class="line"><a id="l00239" name="l00239"></a><span class="lineno">  239</span>      ok = <a class="code hl_variable" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a152b99bc327c774553e9b90a5f0bc4d3">m_mq</a>-&gt;try_send(<a class="code hl_function" href="namespaceipc_1_1util.html#a2bb38cee29dacbe56de5182221b45941">blob_data</a>, blob.size(), 0); <span class="comment">// Throws &lt;=&gt; error wrapper sets truthy *err_code.</span></div>
<div class="line"><a id="l00240" name="l00240"></a><span class="lineno">  240</span>    });</div>
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno">  241</span>    <span class="keywordflow">if</span> (*err_code || ok)</div>
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno">  242</span>    {</div>
<div class="line"><a id="l00243" name="l00243"></a><span class="lineno">  243</span>      <span class="comment">// Threw =&gt; true error =&gt; *err_code set; get out.  Didn&#39;t throw and returned true =&gt; success; get out.</span></div>
<div class="line"><a id="l00244" name="l00244"></a><span class="lineno">  244</span>      <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00245" name="l00245"></a><span class="lineno">  245</span>    }</div>
<div class="line"><a id="l00246" name="l00246"></a><span class="lineno">  246</span>    <span class="comment">// else if (would-block): as promised, INFO logs.</span></div>
<div class="line"><a id="l00247" name="l00247"></a><span class="lineno">  247</span> </div>
<div class="line"><a id="l00248" name="l00248"></a><span class="lineno">  248</span>    FLOW_LOG_TRACE(<span class="stringliteral">&quot;Bipc_mq_handle [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Nb-push of blob @[&quot;</span> &lt;&lt; <a class="code hl_function" href="namespaceipc_1_1util.html#a2bb38cee29dacbe56de5182221b45941">blob_data</a> &lt;&lt; <span class="stringliteral">&quot;], &quot;</span></div>
<div class="line"><a id="l00249" name="l00249"></a><span class="lineno">  249</span>                   <span class="stringliteral">&quot;size [&quot;</span> &lt;&lt; blob.size() &lt;&lt; <span class="stringliteral">&quot;]: would-block.  Executing blocking-wait.&quot;</span>);</div>
<div class="line"><a id="l00250" name="l00250"></a><span class="lineno">  250</span> </div>
<div class="line"><a id="l00251" name="l00251"></a><span class="lineno">  251</span>    <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#ad81eec3af613f32444785f8b5426ec50">wait_sendable</a>(err_code);</div>
<div class="line"><a id="l00252" name="l00252"></a><span class="lineno">  252</span>    <span class="keywordflow">if</span> (*err_code)</div>
<div class="line"><a id="l00253" name="l00253"></a><span class="lineno">  253</span>    {</div>
<div class="line"><a id="l00254" name="l00254"></a><span class="lineno">  254</span>      <span class="comment">// Whether interrupted or true error, we&#39;re done.</span></div>
<div class="line"><a id="l00255" name="l00255"></a><span class="lineno">  255</span>      <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00256" name="l00256"></a><span class="lineno">  256</span>    }</div>
<div class="line"><a id="l00257" name="l00257"></a><span class="lineno">  257</span>    <span class="comment">// else</span></div>
<div class="line"><a id="l00258" name="l00258"></a><span class="lineno">  258</span>    FLOW_LOG_TRACE(<span class="stringliteral">&quot;Blocking-wait reported transmissibility.  Retrying.&quot;</span>);</div>
<div class="line"><a id="l00259" name="l00259"></a><span class="lineno">  259</span>  } <span class="comment">// while (true)</span></div>
<div class="line"><a id="l00260" name="l00260"></a><span class="lineno">  260</span>} <span class="comment">// Bipc_mq_handle::send()</span></div>
<div class="line"><a id="l00261" name="l00261"></a><span class="lineno">  261</span> </div>
<div class="line"><a id="l00262" name="l00262"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a8e486336f1dfffa1c397b725b95b175b">  262</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a8e486336f1dfffa1c397b725b95b175b">Bipc_mq_handle::timed_send</a>(<span class="keyword">const</span> <a class="code hl_typedef" href="namespaceipc_1_1util.html#ae0be7edba7e30ffa3f8b742af621f2ab">util::Blob_const</a>&amp; blob, <a class="code hl_typedef" href="namespaceipc_1_1util.html#ac66141280c3b7295a86b65209f31cc58">util::Fine_duration</a> timeout_from_now,</div>
<div class="line"><a id="l00263" name="l00263"></a><span class="lineno">  263</span>                                <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code)</div>
<div class="line"><a id="l00264" name="l00264"></a><span class="lineno">  264</span>{</div>
<div class="line"><a id="l00265" name="l00265"></a><span class="lineno">  265</span>  <span class="keyword">using </span>flow::util::time_since_posix_epoch;</div>
<div class="line"><a id="l00266" name="l00266"></a><span class="lineno">  266</span>  <span class="keyword">using </span>flow::util::buffers_dump_string;</div>
<div class="line"><a id="l00267" name="l00267"></a><span class="lineno">  267</span>  <span class="keyword">using </span>flow::Fine_clock;</div>
<div class="line"><a id="l00268" name="l00268"></a><span class="lineno">  268</span>  <span class="keyword">using </span>boost::chrono::round;</div>
<div class="line"><a id="l00269" name="l00269"></a><span class="lineno">  269</span>  <span class="keyword">using </span>boost::chrono::microseconds;</div>
<div class="line"><a id="l00270" name="l00270"></a><span class="lineno">  270</span> </div>
<div class="line"><a id="l00271" name="l00271"></a><span class="lineno">  271</span>  FLOW_ERROR_EXEC_AND_THROW_ON_ERROR(<span class="keywordtype">bool</span>, <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a8e486336f1dfffa1c397b725b95b175b">timed_send</a>, blob, timeout_from_now, _1);</div>
<div class="line"><a id="l00272" name="l00272"></a><span class="lineno">  272</span>  <span class="comment">// ^-- Call ourselves and return if err_code is null.  If got to present line, err_code is not null.</span></div>
<div class="line"><a id="l00273" name="l00273"></a><span class="lineno">  273</span> </div>
<div class="line"><a id="l00274" name="l00274"></a><span class="lineno">  274</span>  <span class="comment">// Similar to a combo of (blocking) send() and (non-blocking) try_send() -- keeping comments light where redundant.</span></div>
<div class="line"><a id="l00275" name="l00275"></a><span class="lineno">  275</span> </div>
<div class="line"><a id="l00276" name="l00276"></a><span class="lineno">  276</span>  assert(<a class="code hl_variable" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a152b99bc327c774553e9b90a5f0bc4d3">m_mq</a> &amp;&amp; <span class="stringliteral">&quot;As advertised: timed_send() =&gt; undefined behavior if not successfully cted or was moved-from.&quot;</span>);</div>
<div class="line"><a id="l00277" name="l00277"></a><span class="lineno">  277</span> </div>
<div class="line"><a id="l00278" name="l00278"></a><span class="lineno">  278</span>  <span class="keyword">auto</span> <a class="code hl_function" href="namespaceipc_1_1util.html#a2bb38cee29dacbe56de5182221b45941">blob_data</a> = blob.data();</div>
<div class="line"><a id="l00279" name="l00279"></a><span class="lineno">  279</span>  FLOW_LOG_TRACE(<span class="stringliteral">&quot;Bipc_mq_handle [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Blocking-timed-push of blob @[&quot;</span> &lt;&lt; <a class="code hl_function" href="namespaceipc_1_1util.html#a2bb38cee29dacbe56de5182221b45941">blob_data</a> &lt;&lt; <span class="stringliteral">&quot;], &quot;</span></div>
<div class="line"><a id="l00280" name="l00280"></a><span class="lineno">  280</span>                 <span class="stringliteral">&quot;size [&quot;</span> &lt;&lt; blob.size() &lt;&lt; <span class="stringliteral">&quot;]; timeout ~[&quot;</span> &lt;&lt; round&lt;microseconds&gt;(timeout_from_now) &lt;&lt; <span class="stringliteral">&quot;].  &quot;</span></div>
<div class="line"><a id="l00281" name="l00281"></a><span class="lineno">  281</span>                 <span class="stringliteral">&quot;Trying nb-push first; if it succeeds -- great.  Else will wait/retry/wait/retry/....&quot;</span>);</div>
<div class="line"><a id="l00282" name="l00282"></a><span class="lineno">  282</span>  <span class="keywordflow">if</span> (blob.size() == 0)</div>
<div class="line"><a id="l00283" name="l00283"></a><span class="lineno">  283</span>  {</div>
<div class="line"><a id="l00284" name="l00284"></a><span class="lineno">  284</span>    <span class="comment">// See similarly-placed comment in try_send() which explains this.</span></div>
<div class="line"><a id="l00285" name="l00285"></a><span class="lineno">  285</span>    <a class="code hl_function" href="namespaceipc_1_1util.html#a2bb38cee29dacbe56de5182221b45941">blob_data</a> = <span class="keyword">static_cast&lt;</span><span class="keyword">const </span><span class="keywordtype">void</span>*<span class="keyword">&gt;</span>(&amp;<a class="code hl_function" href="namespaceipc_1_1util.html#a2bb38cee29dacbe56de5182221b45941">blob_data</a>);</div>
<div class="line"><a id="l00286" name="l00286"></a><span class="lineno">  286</span>  }</div>
<div class="line"><a id="l00287" name="l00287"></a><span class="lineno">  287</span>  <span class="keywordflow">else</span> <span class="comment">// if (blob.size() != 0)</span></div>
<div class="line"><a id="l00288" name="l00288"></a><span class="lineno">  288</span>  {</div>
<div class="line"><a id="l00289" name="l00289"></a><span class="lineno">  289</span>    FLOW_LOG_DATA(<span class="stringliteral">&quot;Blob contents: [\n&quot;</span> &lt;&lt; buffers_dump_string(blob, <span class="stringliteral">&quot;  &quot;</span>) &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00290" name="l00290"></a><span class="lineno">  290</span>  }</div>
<div class="line"><a id="l00291" name="l00291"></a><span class="lineno">  291</span> </div>
<div class="line"><a id="l00292" name="l00292"></a><span class="lineno">  292</span>  <span class="keyword">auto</span> now = Fine_clock::now();</div>
<div class="line"><a id="l00293" name="l00293"></a><span class="lineno">  293</span>  <span class="keyword">auto</span> after = now;</div>
<div class="line"><a id="l00294" name="l00294"></a><span class="lineno">  294</span>  <span class="keywordtype">bool</span> ok;</div>
<div class="line"><a id="l00295" name="l00295"></a><span class="lineno">  295</span> </div>
<div class="line"><a id="l00296" name="l00296"></a><span class="lineno">  296</span>  <span class="keywordflow">while</span> (<span class="keyword">true</span>)</div>
<div class="line"><a id="l00297" name="l00297"></a><span class="lineno">  297</span>  {</div>
<div class="line"><a id="l00298" name="l00298"></a><span class="lineno">  298</span>    <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a9948742d87298d5842d298de9c946c7c">op_with_possible_bipc_mq_exception</a>(err_code, <span class="stringliteral">&quot;Bipc_mq_handle::timed_send(): bipc::message_queue::try_send()&quot;</span>,</div>
<div class="line"><a id="l00299" name="l00299"></a><span class="lineno">  299</span>                                       [&amp;]()</div>
<div class="line"><a id="l00300" name="l00300"></a><span class="lineno">  300</span>    {</div>
<div class="line"><a id="l00301" name="l00301"></a><span class="lineno">  301</span>      ok = <a class="code hl_variable" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a152b99bc327c774553e9b90a5f0bc4d3">m_mq</a>-&gt;try_send(<a class="code hl_function" href="namespaceipc_1_1util.html#a2bb38cee29dacbe56de5182221b45941">blob_data</a>, blob.size(), 0); <span class="comment">// Throws &lt;=&gt; error wrapper sets truthy *err_code.</span></div>
<div class="line"><a id="l00302" name="l00302"></a><span class="lineno">  302</span>    });</div>
<div class="line"><a id="l00303" name="l00303"></a><span class="lineno">  303</span>    <span class="keywordflow">if</span> (*err_code)</div>
<div class="line"><a id="l00304" name="l00304"></a><span class="lineno">  304</span>    {</div>
<div class="line"><a id="l00305" name="l00305"></a><span class="lineno">  305</span>      <span class="comment">// Threw =&gt; true error =&gt; *err_code set; get out.</span></div>
<div class="line"><a id="l00306" name="l00306"></a><span class="lineno">  306</span>      <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00307" name="l00307"></a><span class="lineno">  307</span>    }</div>
<div class="line"><a id="l00308" name="l00308"></a><span class="lineno">  308</span>    <span class="comment">// else if (would-block or success):</span></div>
<div class="line"><a id="l00309" name="l00309"></a><span class="lineno">  309</span>    <span class="keywordflow">if</span> (ok)</div>
<div class="line"><a id="l00310" name="l00310"></a><span class="lineno">  310</span>    {</div>
<div class="line"><a id="l00311" name="l00311"></a><span class="lineno">  311</span>      <span class="keywordflow">break</span>; <span class="comment">// Instant success.</span></div>
<div class="line"><a id="l00312" name="l00312"></a><span class="lineno">  312</span>    }</div>
<div class="line"><a id="l00313" name="l00313"></a><span class="lineno">  313</span>    <span class="comment">// else if (would-block): as promised, INFO logs.</span></div>
<div class="line"><a id="l00314" name="l00314"></a><span class="lineno">  314</span> </div>
<div class="line"><a id="l00315" name="l00315"></a><span class="lineno">  315</span>    FLOW_LOG_TRACE(<span class="stringliteral">&quot;Bipc_mq_handle [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Nb-push of blob @[&quot;</span> &lt;&lt; <a class="code hl_function" href="namespaceipc_1_1util.html#a2bb38cee29dacbe56de5182221b45941">blob_data</a> &lt;&lt; <span class="stringliteral">&quot;], &quot;</span></div>
<div class="line"><a id="l00316" name="l00316"></a><span class="lineno">  316</span>                   <span class="stringliteral">&quot;size [&quot;</span> &lt;&lt; blob.size() &lt;&lt; <span class="stringliteral">&quot;]: would-block.  Executing blocking-wait.&quot;</span>);</div>
<div class="line"><a id="l00317" name="l00317"></a><span class="lineno">  317</span> </div>
<div class="line"><a id="l00318" name="l00318"></a><span class="lineno">  318</span>    timeout_from_now -= (after - now); <span class="comment">// No-op the first time; after that reduces time left.</span></div>
<div class="line"><a id="l00319" name="l00319"></a><span class="lineno">  319</span>    <span class="keyword">const</span> <span class="keywordtype">bool</span> ready = <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a164168adee0d188da11db8f17442dbef">timed_wait_sendable</a>(timeout_from_now, err_code);</div>
<div class="line"><a id="l00320" name="l00320"></a><span class="lineno">  320</span>    <span class="keywordflow">if</span> (*err_code)</div>
<div class="line"><a id="l00321" name="l00321"></a><span class="lineno">  321</span>    {</div>
<div class="line"><a id="l00322" name="l00322"></a><span class="lineno">  322</span>      <span class="comment">// Whether interrupted or true error, we&#39;re done.</span></div>
<div class="line"><a id="l00323" name="l00323"></a><span class="lineno">  323</span>      <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00324" name="l00324"></a><span class="lineno">  324</span>    }</div>
<div class="line"><a id="l00325" name="l00325"></a><span class="lineno">  325</span>    <span class="comment">// else:</span></div>
<div class="line"><a id="l00326" name="l00326"></a><span class="lineno">  326</span> </div>
<div class="line"><a id="l00327" name="l00327"></a><span class="lineno">  327</span>    <span class="keywordflow">if</span> (!ready) <span class="comment">// I.e., if (timed out).</span></div>
<div class="line"><a id="l00328" name="l00328"></a><span class="lineno">  328</span>    {</div>
<div class="line"><a id="l00329" name="l00329"></a><span class="lineno">  329</span>      FLOW_LOG_TRACE(<span class="stringliteral">&quot;Did not finish before timeout.&quot;</span>);</div>
<div class="line"><a id="l00330" name="l00330"></a><span class="lineno">  330</span>      <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00331" name="l00331"></a><span class="lineno">  331</span>    }</div>
<div class="line"><a id="l00332" name="l00332"></a><span class="lineno">  332</span>    <span class="comment">// else: successful wait for transmissibility.  Try nb-transmitting again.</span></div>
<div class="line"><a id="l00333" name="l00333"></a><span class="lineno">  333</span>    FLOW_LOG_TRACE(<span class="stringliteral">&quot;Blocking-wait reported transmissibility.  Retrying.&quot;</span>);</div>
<div class="line"><a id="l00334" name="l00334"></a><span class="lineno">  334</span> </div>
<div class="line"><a id="l00335" name="l00335"></a><span class="lineno">  335</span>    after = Fine_clock::now();</div>
<div class="line"><a id="l00336" name="l00336"></a><span class="lineno">  336</span>    assert((after &gt;= now) &amp;&amp; <span class="stringliteral">&quot;Fine_clock is supposed to never go backwards.&quot;</span>);</div>
<div class="line"><a id="l00337" name="l00337"></a><span class="lineno">  337</span>  } <span class="comment">// while (true)</span></div>
<div class="line"><a id="l00338" name="l00338"></a><span class="lineno">  338</span> </div>
<div class="line"><a id="l00339" name="l00339"></a><span class="lineno">  339</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00340" name="l00340"></a><span class="lineno">  340</span>} <span class="comment">// Bipc_mq_handle::timed_send()</span></div>
<div class="line"><a id="l00341" name="l00341"></a><span class="lineno">  341</span> </div>
<div class="line"><a id="l00342" name="l00342"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a7a974f3cfbb095f0b67e773f4f2fb1a9">  342</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a7a974f3cfbb095f0b67e773f4f2fb1a9">Bipc_mq_handle::try_receive</a>(<a class="code hl_typedef" href="namespaceipc_1_1util.html#a6cb62ae434900f3a8915b33ec5d61a96">util::Blob_mutable</a>* blob, <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code)</div>
<div class="line"><a id="l00343" name="l00343"></a><span class="lineno">  343</span>{</div>
<div class="line"><a id="l00344" name="l00344"></a><span class="lineno">  344</span>  <span class="keyword">using </span>flow::util::buffers_dump_string;</div>
<div class="line"><a id="l00345" name="l00345"></a><span class="lineno">  345</span>  <span class="keyword">using </span><a class="code hl_typedef" href="namespaceipc_1_1util.html#a6cb62ae434900f3a8915b33ec5d61a96">util::Blob_mutable</a>;</div>
<div class="line"><a id="l00346" name="l00346"></a><span class="lineno">  346</span> </div>
<div class="line"><a id="l00347" name="l00347"></a><span class="lineno">  347</span>  FLOW_ERROR_EXEC_AND_THROW_ON_ERROR(<span class="keywordtype">bool</span>, <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a7a974f3cfbb095f0b67e773f4f2fb1a9">try_receive</a>, blob, _1);</div>
<div class="line"><a id="l00348" name="l00348"></a><span class="lineno">  348</span>  <span class="comment">// ^-- Call ourselves and return if err_code is null.  If got to present line, err_code is not null.</span></div>
<div class="line"><a id="l00349" name="l00349"></a><span class="lineno">  349</span> </div>
<div class="line"><a id="l00350" name="l00350"></a><span class="lineno">  350</span>  assert(<a class="code hl_variable" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a152b99bc327c774553e9b90a5f0bc4d3">m_mq</a> &amp;&amp; <span class="stringliteral">&quot;As advertised: try_receive() =&gt; undefined behavior if not successfully cted or was moved-from.&quot;</span>);</div>
<div class="line"><a id="l00351" name="l00351"></a><span class="lineno">  351</span> </div>
<div class="line"><a id="l00352" name="l00352"></a><span class="lineno">  352</span>  <span class="keywordtype">bool</span> not_blocked;</div>
<div class="line"><a id="l00353" name="l00353"></a><span class="lineno">  353</span>  <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a9948742d87298d5842d298de9c946c7c">op_with_possible_bipc_mq_exception</a>(err_code,  <span class="stringliteral">&quot;Bipc_mq_handle::try_receive(): bipc::message_queue::try_receive()&quot;</span>,</div>
<div class="line"><a id="l00354" name="l00354"></a><span class="lineno">  354</span>                                     [&amp;]()</div>
<div class="line"><a id="l00355" name="l00355"></a><span class="lineno">  355</span>  {</div>
<div class="line"><a id="l00356" name="l00356"></a><span class="lineno">  356</span>    FLOW_LOG_TRACE(<span class="stringliteral">&quot;Bipc_mq_handle [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Nb-pop to blob @[&quot;</span> &lt;&lt; blob-&gt;data() &lt;&lt; <span class="stringliteral">&quot;], &quot;</span></div>
<div class="line"><a id="l00357" name="l00357"></a><span class="lineno">  357</span>                   <span class="stringliteral">&quot;max-size [&quot;</span> &lt;&lt; blob-&gt;size() &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00358" name="l00358"></a><span class="lineno">  358</span> </div>
<div class="line"><a id="l00359" name="l00359"></a><span class="lineno">  359</span>    <span class="keywordtype">size_t</span> n_rcvd = {};</div>
<div class="line"><a id="l00360" name="l00360"></a><span class="lineno">  360</span>    <span class="comment">/* (^-- Initializer not needed algorithmically, but gcc-13 gives maybe-uninitialized warning;</span></div>
<div class="line"><a id="l00361" name="l00361"></a><span class="lineno">  361</span><span class="comment">     * while at least various modern clangs and gcc-9 are fine.  It&#39;s OK; we can afford it.) */</span></div>
<div class="line"><a id="l00362" name="l00362"></a><span class="lineno">  362</span>    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> pri_ignored;</div>
<div class="line"><a id="l00363" name="l00363"></a><span class="lineno">  363</span>    not_blocked <span class="comment">// Throws &lt;=&gt; error wrapper sets truthy *err_code. --v</span></div>
<div class="line"><a id="l00364" name="l00364"></a><span class="lineno">  364</span>      = <a class="code hl_variable" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a152b99bc327c774553e9b90a5f0bc4d3">m_mq</a>-&gt;try_receive(blob-&gt;data(), blob-&gt;size(), n_rcvd, pri_ignored);</div>
<div class="line"><a id="l00365" name="l00365"></a><span class="lineno">  365</span>    <span class="keywordflow">if</span> (not_blocked)</div>
<div class="line"><a id="l00366" name="l00366"></a><span class="lineno">  366</span>    {</div>
<div class="line"><a id="l00367" name="l00367"></a><span class="lineno">  367</span>      *blob = <a class="code hl_typedef" href="namespaceipc_1_1util.html#a6cb62ae434900f3a8915b33ec5d61a96">Blob_mutable</a>(blob-&gt;data(), n_rcvd);</div>
<div class="line"><a id="l00368" name="l00368"></a><span class="lineno">  368</span>      FLOW_LOG_TRACE(<span class="stringliteral">&quot;Received message sized [&quot;</span> &lt;&lt; n_rcvd &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00369" name="l00369"></a><span class="lineno">  369</span>      <span class="keywordflow">if</span> (blob-&gt;size() != 0)</div>
<div class="line"><a id="l00370" name="l00370"></a><span class="lineno">  370</span>      {</div>
<div class="line"><a id="l00371" name="l00371"></a><span class="lineno">  371</span>        FLOW_LOG_DATA(<span class="stringliteral">&quot;Blob contents: [\n&quot;</span> &lt;&lt; buffers_dump_string(*blob, <span class="stringliteral">&quot;  &quot;</span>) &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00372" name="l00372"></a><span class="lineno">  372</span>      }</div>
<div class="line"><a id="l00373" name="l00373"></a><span class="lineno">  373</span>    }</div>
<div class="line"><a id="l00374" name="l00374"></a><span class="lineno">  374</span>    <span class="keywordflow">else</span> <span class="comment">// if (!not_blocked)</span></div>
<div class="line"><a id="l00375" name="l00375"></a><span class="lineno">  375</span>    {</div>
<div class="line"><a id="l00376" name="l00376"></a><span class="lineno">  376</span>      FLOW_LOG_TRACE(<span class="stringliteral">&quot;Bipc_mq_handle [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Nb-pop to blob @[&quot;</span> &lt;&lt; blob-&gt;data() &lt;&lt; <span class="stringliteral">&quot;], &quot;</span></div>
<div class="line"><a id="l00377" name="l00377"></a><span class="lineno">  377</span>                    <span class="stringliteral">&quot;max-size [&quot;</span> &lt;&lt; blob-&gt;size() &lt;&lt; <span class="stringliteral">&quot;]: would-block.&quot;</span>);</div>
<div class="line"><a id="l00378" name="l00378"></a><span class="lineno">  378</span>    }</div>
<div class="line"><a id="l00379" name="l00379"></a><span class="lineno">  379</span>  }); <span class="comment">// op_with_possible_bipc_mq_exception()</span></div>
<div class="line"><a id="l00380" name="l00380"></a><span class="lineno">  380</span>  <span class="keywordflow">if</span> (*err_code) <span class="comment">// It logged if truthy.</span></div>
<div class="line"><a id="l00381" name="l00381"></a><span class="lineno">  381</span>  {</div>
<div class="line"><a id="l00382" name="l00382"></a><span class="lineno">  382</span>    <span class="keywordflow">return</span> <span class="keyword">false</span>; <span class="comment">// not_blocked is garbage; *blob is untouched.</span></div>
<div class="line"><a id="l00383" name="l00383"></a><span class="lineno">  383</span>  }</div>
<div class="line"><a id="l00384" name="l00384"></a><span class="lineno">  384</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00385" name="l00385"></a><span class="lineno">  385</span> </div>
<div class="line"><a id="l00386" name="l00386"></a><span class="lineno">  386</span>  <span class="keywordflow">return</span> not_blocked; <span class="comment">// Logged about it already.</span></div>
<div class="line"><a id="l00387" name="l00387"></a><span class="lineno">  387</span>} <span class="comment">// Bipc_mq_handle::try_receive()</span></div>
<div class="line"><a id="l00388" name="l00388"></a><span class="lineno">  388</span> </div>
<div class="line"><a id="l00389" name="l00389"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a9d1aaf82f6396f4d975a77a70433698d">  389</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a9d1aaf82f6396f4d975a77a70433698d">Bipc_mq_handle::receive</a>(<a class="code hl_typedef" href="namespaceipc_1_1util.html#a6cb62ae434900f3a8915b33ec5d61a96">util::Blob_mutable</a>* blob, <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code)</div>
<div class="line"><a id="l00390" name="l00390"></a><span class="lineno">  390</span>{</div>
<div class="line"><a id="l00391" name="l00391"></a><span class="lineno">  391</span>  <span class="keyword">using </span>flow::util::buffers_dump_string;</div>
<div class="line"><a id="l00392" name="l00392"></a><span class="lineno">  392</span>  <span class="keyword">using </span><a class="code hl_typedef" href="namespaceipc_1_1util.html#a6cb62ae434900f3a8915b33ec5d61a96">util::Blob_mutable</a>;</div>
<div class="line"><a id="l00393" name="l00393"></a><span class="lineno">  393</span> </div>
<div class="line"><a id="l00394" name="l00394"></a><span class="lineno">  394</span>  <span class="keywordflow">if</span> (flow::error::exec_void_and_throw_on_error</div>
<div class="line"><a id="l00395" name="l00395"></a><span class="lineno">  395</span>        ([&amp;](<a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* actual_err_code) { <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a9d1aaf82f6396f4d975a77a70433698d">receive</a>(blob, actual_err_code); },</div>
<div class="line"><a id="l00396" name="l00396"></a><span class="lineno">  396</span>         err_code, <span class="stringliteral">&quot;Bipc_mq_handle::receive()&quot;</span>))</div>
<div class="line"><a id="l00397" name="l00397"></a><span class="lineno">  397</span>  {</div>
<div class="line"><a id="l00398" name="l00398"></a><span class="lineno">  398</span>    <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00399" name="l00399"></a><span class="lineno">  399</span>  }</div>
<div class="line"><a id="l00400" name="l00400"></a><span class="lineno">  400</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00401" name="l00401"></a><span class="lineno">  401</span>  err_code-&gt;clear();</div>
<div class="line"><a id="l00402" name="l00402"></a><span class="lineno">  402</span> </div>
<div class="line"><a id="l00403" name="l00403"></a><span class="lineno">  403</span>  assert(<a class="code hl_variable" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a152b99bc327c774553e9b90a5f0bc4d3">m_mq</a> &amp;&amp; <span class="stringliteral">&quot;As advertised: receive() =&gt; undefined behavior if not successfully cted or was moved-from.&quot;</span>);</div>
<div class="line"><a id="l00404" name="l00404"></a><span class="lineno">  404</span> </div>
<div class="line"><a id="l00405" name="l00405"></a><span class="lineno">  405</span>  FLOW_LOG_TRACE(<span class="stringliteral">&quot;Bipc_mq_handle [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Blocking-pop to blob @[&quot;</span> &lt;&lt; blob-&gt;data() &lt;&lt; <span class="stringliteral">&quot;], &quot;</span></div>
<div class="line"><a id="l00406" name="l00406"></a><span class="lineno">  406</span>                 <span class="stringliteral">&quot;max-size [&quot;</span> &lt;&lt; blob-&gt;size() &lt;&lt; <span class="stringliteral">&quot;].  Trying nb-pop first; if it succeeds -- great.  &quot;</span></div>
<div class="line"><a id="l00407" name="l00407"></a><span class="lineno">  407</span>                 <span class="stringliteral">&quot;Else will wait/retry/wait/retry/....&quot;</span>);</div>
<div class="line"><a id="l00408" name="l00408"></a><span class="lineno">  408</span> </div>
<div class="line"><a id="l00409" name="l00409"></a><span class="lineno">  409</span>  <span class="comment">/* We could just invoke blocking m_mq-&gt;receive(), but to get the promised logging we go a tiny bit fancier as follows.</span></div>
<div class="line"><a id="l00410" name="l00410"></a><span class="lineno">  410</span><span class="comment">   * Update: Now that we have to be interrupt_*()ible, also reuse wait_*() instead of using native</span></div>
<div class="line"><a id="l00411" name="l00411"></a><span class="lineno">  411</span><span class="comment">   * m_mq-&gt;*(). */</span></div>
<div class="line"><a id="l00412" name="l00412"></a><span class="lineno">  412</span> </div>
<div class="line"><a id="l00413" name="l00413"></a><span class="lineno">  413</span>  <span class="keywordtype">size_t</span> n_rcvd = {}; <span class="comment">// (Why initialize?  See comment near first such initializer for explanation.)</span></div>
<div class="line"><a id="l00414" name="l00414"></a><span class="lineno">  414</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> pri_ignored;</div>
<div class="line"><a id="l00415" name="l00415"></a><span class="lineno">  415</span>  <span class="keywordtype">bool</span> ok;</div>
<div class="line"><a id="l00416" name="l00416"></a><span class="lineno">  416</span> </div>
<div class="line"><a id="l00417" name="l00417"></a><span class="lineno">  417</span>  <span class="keywordflow">while</span> (<span class="keyword">true</span>)</div>
<div class="line"><a id="l00418" name="l00418"></a><span class="lineno">  418</span>  {</div>
<div class="line"><a id="l00419" name="l00419"></a><span class="lineno">  419</span>    <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a9948742d87298d5842d298de9c946c7c">op_with_possible_bipc_mq_exception</a>(err_code, <span class="stringliteral">&quot;Bipc_mq_handle::receive(): bipc::message_queue::try_receive()&quot;</span>,</div>
<div class="line"><a id="l00420" name="l00420"></a><span class="lineno">  420</span>                                     [&amp;]()</div>
<div class="line"><a id="l00421" name="l00421"></a><span class="lineno">  421</span>    {</div>
<div class="line"><a id="l00422" name="l00422"></a><span class="lineno">  422</span>      ok = <a class="code hl_variable" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a152b99bc327c774553e9b90a5f0bc4d3">m_mq</a>-&gt;try_receive(blob-&gt;data(), blob-&gt;size(), <span class="comment">// Throws &lt;=&gt; error wrapper sets truthy *err_code.</span></div>
<div class="line"><a id="l00423" name="l00423"></a><span class="lineno">  423</span>                             n_rcvd, pri_ignored);</div>
<div class="line"><a id="l00424" name="l00424"></a><span class="lineno">  424</span>    });</div>
<div class="line"><a id="l00425" name="l00425"></a><span class="lineno">  425</span>    <span class="keywordflow">if</span> (*err_code)</div>
<div class="line"><a id="l00426" name="l00426"></a><span class="lineno">  426</span>    {</div>
<div class="line"><a id="l00427" name="l00427"></a><span class="lineno">  427</span>      <span class="comment">// Threw =&gt; true error =&gt; *err_code set; get out.</span></div>
<div class="line"><a id="l00428" name="l00428"></a><span class="lineno">  428</span>      <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00429" name="l00429"></a><span class="lineno">  429</span>    }</div>
<div class="line"><a id="l00430" name="l00430"></a><span class="lineno">  430</span>    <span class="comment">// else if (would-block or success):</span></div>
<div class="line"><a id="l00431" name="l00431"></a><span class="lineno">  431</span>    <span class="keywordflow">if</span> (ok)</div>
<div class="line"><a id="l00432" name="l00432"></a><span class="lineno">  432</span>    {</div>
<div class="line"><a id="l00433" name="l00433"></a><span class="lineno">  433</span>      *blob = <a class="code hl_typedef" href="namespaceipc_1_1util.html#a6cb62ae434900f3a8915b33ec5d61a96">Blob_mutable</a>(blob-&gt;data(), n_rcvd);</div>
<div class="line"><a id="l00434" name="l00434"></a><span class="lineno">  434</span>      FLOW_LOG_TRACE(<span class="stringliteral">&quot;Received message sized [&quot;</span> &lt;&lt; n_rcvd &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00435" name="l00435"></a><span class="lineno">  435</span>      <span class="keywordflow">if</span> (blob-&gt;size() != 0)</div>
<div class="line"><a id="l00436" name="l00436"></a><span class="lineno">  436</span>      {</div>
<div class="line"><a id="l00437" name="l00437"></a><span class="lineno">  437</span>        FLOW_LOG_DATA(<span class="stringliteral">&quot;Blob contents: [\n&quot;</span> &lt;&lt; buffers_dump_string(*blob, <span class="stringliteral">&quot;  &quot;</span>) &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00438" name="l00438"></a><span class="lineno">  438</span>      }</div>
<div class="line"><a id="l00439" name="l00439"></a><span class="lineno">  439</span>      <span class="keywordflow">return</span>; <span class="comment">// Instant success.</span></div>
<div class="line"><a id="l00440" name="l00440"></a><span class="lineno">  440</span>    }</div>
<div class="line"><a id="l00441" name="l00441"></a><span class="lineno">  441</span>    <span class="comment">// else if (would-block): as promised, INFO logs.</span></div>
<div class="line"><a id="l00442" name="l00442"></a><span class="lineno">  442</span> </div>
<div class="line"><a id="l00443" name="l00443"></a><span class="lineno">  443</span>    FLOW_LOG_TRACE(<span class="stringliteral">&quot;Bipc_mq_handle [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Nb-pop to blob @[&quot;</span> &lt;&lt; blob-&gt;data() &lt;&lt; <span class="stringliteral">&quot;], &quot;</span></div>
<div class="line"><a id="l00444" name="l00444"></a><span class="lineno">  444</span>                  <span class="stringliteral">&quot;max-size [&quot;</span> &lt;&lt; blob-&gt;size() &lt;&lt; <span class="stringliteral">&quot;]: would-block.  Executing blocking-pop.&quot;</span>);</div>
<div class="line"><a id="l00445" name="l00445"></a><span class="lineno">  445</span> </div>
<div class="line"><a id="l00446" name="l00446"></a><span class="lineno">  446</span>    <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a7e2d79b92673be3ddba30c6d57020125">wait_receivable</a>(err_code);</div>
<div class="line"><a id="l00447" name="l00447"></a><span class="lineno">  447</span>    <span class="keywordflow">if</span> (*err_code)</div>
<div class="line"><a id="l00448" name="l00448"></a><span class="lineno">  448</span>    {</div>
<div class="line"><a id="l00449" name="l00449"></a><span class="lineno">  449</span>      <span class="comment">// Whether interrupted or true error, we&#39;re done.</span></div>
<div class="line"><a id="l00450" name="l00450"></a><span class="lineno">  450</span>      <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00451" name="l00451"></a><span class="lineno">  451</span>    }</div>
<div class="line"><a id="l00452" name="l00452"></a><span class="lineno">  452</span>    <span class="comment">// else</span></div>
<div class="line"><a id="l00453" name="l00453"></a><span class="lineno">  453</span>    FLOW_LOG_TRACE(<span class="stringliteral">&quot;Blocking-wait reported transmissibility.  Retrying.&quot;</span>);</div>
<div class="line"><a id="l00454" name="l00454"></a><span class="lineno">  454</span>  } <span class="comment">// while (true)</span></div>
<div class="line"><a id="l00455" name="l00455"></a><span class="lineno">  455</span>} <span class="comment">// Bipc_mq_handle::receive()</span></div>
<div class="line"><a id="l00456" name="l00456"></a><span class="lineno">  456</span> </div>
<div class="line"><a id="l00457" name="l00457"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a67be05bc1749981e0863d18681d006ac">  457</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a67be05bc1749981e0863d18681d006ac">Bipc_mq_handle::timed_receive</a>(<a class="code hl_typedef" href="namespaceipc_1_1util.html#a6cb62ae434900f3a8915b33ec5d61a96">util::Blob_mutable</a>* blob, <a class="code hl_typedef" href="namespaceipc_1_1util.html#ac66141280c3b7295a86b65209f31cc58">util::Fine_duration</a> timeout_from_now, <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code)</div>
<div class="line"><a id="l00458" name="l00458"></a><span class="lineno">  458</span>{</div>
<div class="line"><a id="l00459" name="l00459"></a><span class="lineno">  459</span>  <span class="keyword">using </span><a class="code hl_typedef" href="namespaceipc_1_1util.html#a6cb62ae434900f3a8915b33ec5d61a96">util::Blob_mutable</a>;</div>
<div class="line"><a id="l00460" name="l00460"></a><span class="lineno">  460</span>  <span class="keyword">using </span>flow::util::time_since_posix_epoch;</div>
<div class="line"><a id="l00461" name="l00461"></a><span class="lineno">  461</span>  <span class="keyword">using </span>flow::util::buffers_dump_string;</div>
<div class="line"><a id="l00462" name="l00462"></a><span class="lineno">  462</span>  <span class="keyword">using </span>flow::Fine_clock;</div>
<div class="line"><a id="l00463" name="l00463"></a><span class="lineno">  463</span>  <span class="keyword">using </span>boost::chrono::round;</div>
<div class="line"><a id="l00464" name="l00464"></a><span class="lineno">  464</span>  <span class="keyword">using </span>boost::chrono::microseconds;</div>
<div class="line"><a id="l00465" name="l00465"></a><span class="lineno">  465</span> </div>
<div class="line"><a id="l00466" name="l00466"></a><span class="lineno">  466</span>  FLOW_ERROR_EXEC_AND_THROW_ON_ERROR(<span class="keywordtype">bool</span>, <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a67be05bc1749981e0863d18681d006ac">timed_receive</a>, blob, timeout_from_now, _1);</div>
<div class="line"><a id="l00467" name="l00467"></a><span class="lineno">  467</span>  <span class="comment">// ^-- Call ourselves and return if err_code is null.  If got to present line, err_code is not null.</span></div>
<div class="line"><a id="l00468" name="l00468"></a><span class="lineno">  468</span> </div>
<div class="line"><a id="l00469" name="l00469"></a><span class="lineno">  469</span>  <span class="comment">// Similar to a combo of (blocking) receive() and (non-blocking) try_receive() -- keeping comments light.</span></div>
<div class="line"><a id="l00470" name="l00470"></a><span class="lineno">  470</span> </div>
<div class="line"><a id="l00471" name="l00471"></a><span class="lineno">  471</span>  assert(<a class="code hl_variable" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a152b99bc327c774553e9b90a5f0bc4d3">m_mq</a> &amp;&amp; <span class="stringliteral">&quot;As advertised: timed_receive() =&gt; undefined behavior if not successfully cted or was moved-from.&quot;</span>);</div>
<div class="line"><a id="l00472" name="l00472"></a><span class="lineno">  472</span> </div>
<div class="line"><a id="l00473" name="l00473"></a><span class="lineno">  473</span>  FLOW_LOG_TRACE(<span class="stringliteral">&quot;Bipc_mq_handle [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Blocking-timed-pop to blob @[&quot;</span> &lt;&lt; blob-&gt;data() &lt;&lt; <span class="stringliteral">&quot;], &quot;</span></div>
<div class="line"><a id="l00474" name="l00474"></a><span class="lineno">  474</span>                 <span class="stringliteral">&quot;max-size [&quot;</span> &lt;&lt; blob-&gt;size() &lt;&lt; <span class="stringliteral">&quot;]; timeout ~[&quot;</span> &lt;&lt; round&lt;microseconds&gt;(timeout_from_now) &lt;&lt; <span class="stringliteral">&quot;].  &quot;</span></div>
<div class="line"><a id="l00475" name="l00475"></a><span class="lineno">  475</span>                 <span class="stringliteral">&quot;Trying nb-pop first; if it succeeds -- great.  Else will wait/retry/wait/retry/....&quot;</span>);</div>
<div class="line"><a id="l00476" name="l00476"></a><span class="lineno">  476</span> </div>
<div class="line"><a id="l00477" name="l00477"></a><span class="lineno">  477</span>  <span class="keywordtype">size_t</span> n_rcvd = {}; <span class="comment">// (Why initialize?  See comment near first such initializer for explanation.)</span></div>
<div class="line"><a id="l00478" name="l00478"></a><span class="lineno">  478</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> pri_ignored;</div>
<div class="line"><a id="l00479" name="l00479"></a><span class="lineno">  479</span> </div>
<div class="line"><a id="l00480" name="l00480"></a><span class="lineno">  480</span>  <span class="keyword">auto</span> now = Fine_clock::now();</div>
<div class="line"><a id="l00481" name="l00481"></a><span class="lineno">  481</span>  <span class="keyword">auto</span> after = now;</div>
<div class="line"><a id="l00482" name="l00482"></a><span class="lineno">  482</span>  <span class="keywordtype">bool</span> ok;</div>
<div class="line"><a id="l00483" name="l00483"></a><span class="lineno">  483</span> </div>
<div class="line"><a id="l00484" name="l00484"></a><span class="lineno">  484</span>  <span class="keywordflow">while</span> (<span class="keyword">true</span>)</div>
<div class="line"><a id="l00485" name="l00485"></a><span class="lineno">  485</span>  {</div>
<div class="line"><a id="l00486" name="l00486"></a><span class="lineno">  486</span>    <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a9948742d87298d5842d298de9c946c7c">op_with_possible_bipc_mq_exception</a>(err_code, <span class="stringliteral">&quot;Bipc_mq_handle::timed_send(): bipc::message_queue::try_send()&quot;</span>,</div>
<div class="line"><a id="l00487" name="l00487"></a><span class="lineno">  487</span>                                       [&amp;]()</div>
<div class="line"><a id="l00488" name="l00488"></a><span class="lineno">  488</span>    {</div>
<div class="line"><a id="l00489" name="l00489"></a><span class="lineno">  489</span>      ok = <a class="code hl_variable" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a152b99bc327c774553e9b90a5f0bc4d3">m_mq</a>-&gt;try_receive(blob-&gt;data(), blob-&gt;size(), <span class="comment">// Throws &lt;=&gt; error wrapper sets truthy *err_code.</span></div>
<div class="line"><a id="l00490" name="l00490"></a><span class="lineno">  490</span>                             n_rcvd, pri_ignored);</div>
<div class="line"><a id="l00491" name="l00491"></a><span class="lineno">  491</span>    });</div>
<div class="line"><a id="l00492" name="l00492"></a><span class="lineno">  492</span>    <span class="keywordflow">if</span> (*err_code)</div>
<div class="line"><a id="l00493" name="l00493"></a><span class="lineno">  493</span>    {</div>
<div class="line"><a id="l00494" name="l00494"></a><span class="lineno">  494</span>      <span class="comment">// Threw =&gt; true error =&gt; *err_code set; get out.</span></div>
<div class="line"><a id="l00495" name="l00495"></a><span class="lineno">  495</span>      <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00496" name="l00496"></a><span class="lineno">  496</span>    }</div>
<div class="line"><a id="l00497" name="l00497"></a><span class="lineno">  497</span>    <span class="comment">// else if (would-block or success):</span></div>
<div class="line"><a id="l00498" name="l00498"></a><span class="lineno">  498</span>    <span class="keywordflow">if</span> (ok)</div>
<div class="line"><a id="l00499" name="l00499"></a><span class="lineno">  499</span>    {</div>
<div class="line"><a id="l00500" name="l00500"></a><span class="lineno">  500</span>      *blob = <a class="code hl_typedef" href="namespaceipc_1_1util.html#a6cb62ae434900f3a8915b33ec5d61a96">Blob_mutable</a>(blob-&gt;data(), n_rcvd);</div>
<div class="line"><a id="l00501" name="l00501"></a><span class="lineno">  501</span>      FLOW_LOG_TRACE(<span class="stringliteral">&quot;Received message sized [&quot;</span> &lt;&lt; n_rcvd &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00502" name="l00502"></a><span class="lineno">  502</span>      <span class="keywordflow">if</span> (blob-&gt;size() != 0)</div>
<div class="line"><a id="l00503" name="l00503"></a><span class="lineno">  503</span>      {</div>
<div class="line"><a id="l00504" name="l00504"></a><span class="lineno">  504</span>        FLOW_LOG_DATA(<span class="stringliteral">&quot;Blob contents: [\n&quot;</span> &lt;&lt; buffers_dump_string(*blob, <span class="stringliteral">&quot;  &quot;</span>) &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00505" name="l00505"></a><span class="lineno">  505</span>      }</div>
<div class="line"><a id="l00506" name="l00506"></a><span class="lineno">  506</span>      <span class="keywordflow">break</span>; <span class="comment">// Instant success.</span></div>
<div class="line"><a id="l00507" name="l00507"></a><span class="lineno">  507</span>    }</div>
<div class="line"><a id="l00508" name="l00508"></a><span class="lineno">  508</span>    <span class="comment">// else if (would-block): as promised, INFO logs.</span></div>
<div class="line"><a id="l00509" name="l00509"></a><span class="lineno">  509</span> </div>
<div class="line"><a id="l00510" name="l00510"></a><span class="lineno">  510</span>    FLOW_LOG_TRACE(<span class="stringliteral">&quot;Bipc_mq_handle [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Nb-pop to blob @[&quot;</span> &lt;&lt; blob-&gt;data() &lt;&lt; <span class="stringliteral">&quot;], &quot;</span></div>
<div class="line"><a id="l00511" name="l00511"></a><span class="lineno">  511</span>                  <span class="stringliteral">&quot;max-size [&quot;</span> &lt;&lt; blob-&gt;size() &lt;&lt; <span class="stringliteral">&quot;]: would-block.  Executing blocking-wait.&quot;</span>);</div>
<div class="line"><a id="l00512" name="l00512"></a><span class="lineno">  512</span> </div>
<div class="line"><a id="l00513" name="l00513"></a><span class="lineno">  513</span>    timeout_from_now -= (after - now); <span class="comment">// No-op the first time; after that reduces time left.</span></div>
<div class="line"><a id="l00514" name="l00514"></a><span class="lineno">  514</span>    <span class="keyword">const</span> <span class="keywordtype">bool</span> ready = <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a5d2035b92c80a1b2e27b9e238107f1b1">timed_wait_receivable</a>(timeout_from_now, err_code);</div>
<div class="line"><a id="l00515" name="l00515"></a><span class="lineno">  515</span>    <span class="keywordflow">if</span> (*err_code)</div>
<div class="line"><a id="l00516" name="l00516"></a><span class="lineno">  516</span>    {</div>
<div class="line"><a id="l00517" name="l00517"></a><span class="lineno">  517</span>      <span class="comment">// Whether interrupted or true error, we&#39;re done.</span></div>
<div class="line"><a id="l00518" name="l00518"></a><span class="lineno">  518</span>      <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00519" name="l00519"></a><span class="lineno">  519</span>    }</div>
<div class="line"><a id="l00520" name="l00520"></a><span class="lineno">  520</span>    <span class="comment">// else:</span></div>
<div class="line"><a id="l00521" name="l00521"></a><span class="lineno">  521</span> </div>
<div class="line"><a id="l00522" name="l00522"></a><span class="lineno">  522</span>    <span class="keywordflow">if</span> (!ready) <span class="comment">// I.e., if (timed out).</span></div>
<div class="line"><a id="l00523" name="l00523"></a><span class="lineno">  523</span>    {</div>
<div class="line"><a id="l00524" name="l00524"></a><span class="lineno">  524</span>      FLOW_LOG_TRACE(<span class="stringliteral">&quot;Did not finish before timeout.&quot;</span>);</div>
<div class="line"><a id="l00525" name="l00525"></a><span class="lineno">  525</span>      <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00526" name="l00526"></a><span class="lineno">  526</span>    }</div>
<div class="line"><a id="l00527" name="l00527"></a><span class="lineno">  527</span>    <span class="comment">// else: successful wait for transmissibility.  Try nb-transmitting again.</span></div>
<div class="line"><a id="l00528" name="l00528"></a><span class="lineno">  528</span>    FLOW_LOG_TRACE(<span class="stringliteral">&quot;Blocking-wait reported transmissibility.  Retrying.&quot;</span>);</div>
<div class="line"><a id="l00529" name="l00529"></a><span class="lineno">  529</span> </div>
<div class="line"><a id="l00530" name="l00530"></a><span class="lineno">  530</span>    after = Fine_clock::now();</div>
<div class="line"><a id="l00531" name="l00531"></a><span class="lineno">  531</span>    assert((after &gt;= now) &amp;&amp; <span class="stringliteral">&quot;Fine_clock is supposed to never go backwards.&quot;</span>);</div>
<div class="line"><a id="l00532" name="l00532"></a><span class="lineno">  532</span>  } <span class="comment">// while (true)</span></div>
<div class="line"><a id="l00533" name="l00533"></a><span class="lineno">  533</span> </div>
<div class="line"><a id="l00534" name="l00534"></a><span class="lineno">  534</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00535" name="l00535"></a><span class="lineno">  535</span>} <span class="comment">// Bipc_mq_handle::timed_receive()</span></div>
<div class="line"><a id="l00536" name="l00536"></a><span class="lineno">  536</span> </div>
<div class="line"><a id="l00537" name="l00537"></a><span class="lineno">  537</span><span class="keyword">template</span>&lt;<span class="keywordtype">bool</span> SND_ELSE_RCV, <span class="keywordtype">bool</span> ON_ELSE_OFF&gt;</div>
<div class="line"><a id="l00538" name="l00538"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Bipc__mq__handle.html#ac52aa9402e0f5d50babff7b06e5eaab3">  538</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#ac52aa9402e0f5d50babff7b06e5eaab3">Bipc_mq_handle::interrupt_allow_impl</a>()</div>
<div class="line"><a id="l00539" name="l00539"></a><span class="lineno">  539</span>{</div>
<div class="line"><a id="l00540" name="l00540"></a><span class="lineno">  540</span>  <span class="keyword">using </span>Classic_shm_area = bipc::ipcdetail::managed_open_or_create_impl&lt;bipc::shared_memory_object, 0, true, false&gt;;</div>
<div class="line"><a id="l00541" name="l00541"></a><span class="lineno">  541</span>  <span class="keyword">using </span>Bipc_mq = bipc::message_queue;</div>
<div class="line"><a id="l00542" name="l00542"></a><span class="lineno">  542</span>  <span class="keyword">using </span>Bipc_mq_hdr = bipc::ipcdetail::mq_hdr_t&lt;Bipc_mq::void_pointer&gt;;</div>
<div class="line"><a id="l00543" name="l00543"></a><span class="lineno">  543</span>  <span class="keyword">using </span>Bipc_mq_mtx = bipc::interprocess_mutex;</div>
<div class="line"><a id="l00544" name="l00544"></a><span class="lineno">  544</span>  <span class="keyword">using </span>Bipc_mq_lock = bipc::scoped_lock&lt;Bipc_mq_mtx&gt;;</div>
<div class="line"><a id="l00545" name="l00545"></a><span class="lineno">  545</span> </div>
<div class="line"><a id="l00546" name="l00546"></a><span class="lineno">  546</span>  assert(<a class="code hl_variable" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a152b99bc327c774553e9b90a5f0bc4d3">m_mq</a></div>
<div class="line"><a id="l00547" name="l00547"></a><span class="lineno">  547</span>         &amp;&amp; <span class="stringliteral">&quot;As advertised: interrupt_allow_impl() =&gt; undefined behavior if not successfully cted or was moved-from.&quot;</span>);</div>
<div class="line"><a id="l00548" name="l00548"></a><span class="lineno">  548</span> </div>
<div class="line"><a id="l00549" name="l00549"></a><span class="lineno">  549</span>  <span class="comment">/* First see m_interrupting_snd doc header.  Then check out wait_impl() carefully.  Then the below will</span></div>
<div class="line"><a id="l00550" name="l00550"></a><span class="lineno">  550</span><span class="comment">   * probably make sense. */</span></div>
<div class="line"><a id="l00551" name="l00551"></a><span class="lineno">  551</span> </div>
<div class="line"><a id="l00552" name="l00552"></a><span class="lineno">  552</span>  <span class="keywordtype">bool</span>* interrupting_ptr;</div>
<div class="line"><a id="l00553" name="l00553"></a><span class="lineno">  553</span>  <span class="keyword">auto</span>&amp; shm_area = <span class="keyword">reinterpret_cast&lt;</span>Classic_shm_area&amp;<span class="keyword">&gt;</span>(*m_mq);</div>
<div class="line"><a id="l00554" name="l00554"></a><span class="lineno">  554</span>  <span class="keyword">auto</span>* <span class="keyword">const</span> mq_hdr = <span class="keyword">static_cast&lt;</span>Bipc_mq_hdr*<span class="keyword">&gt;</span>(shm_area.get_user_address());</div>
<div class="line"><a id="l00555" name="l00555"></a><span class="lineno">  555</span>  <span class="keyword">decltype</span>(mq_hdr-&gt;m_cond_recv)* cond_ptr;</div>
<div class="line"><a id="l00556" name="l00556"></a><span class="lineno">  556</span>  <span class="keywordflow">if</span> <span class="keyword">constexpr</span>(SND_ELSE_RCV)</div>
<div class="line"><a id="l00557" name="l00557"></a><span class="lineno">  557</span>  {</div>
<div class="line"><a id="l00558" name="l00558"></a><span class="lineno">  558</span>    interrupting_ptr = &amp;<a class="code hl_variable" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a85fdfd6a739453c86298e05bb3a55341">m_interrupting_snd</a>;</div>
<div class="line"><a id="l00559" name="l00559"></a><span class="lineno">  559</span>    cond_ptr = &amp;mq_hdr-&gt;m_cond_send;</div>
<div class="line"><a id="l00560" name="l00560"></a><span class="lineno">  560</span>  }</div>
<div class="line"><a id="l00561" name="l00561"></a><span class="lineno">  561</span>  <span class="keywordflow">else</span></div>
<div class="line"><a id="l00562" name="l00562"></a><span class="lineno">  562</span>  {</div>
<div class="line"><a id="l00563" name="l00563"></a><span class="lineno">  563</span>    interrupting_ptr = &amp;<a class="code hl_variable" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a3eb1daea17bbfa332e6f50e4f6625bab">m_interrupting_rcv</a>;</div>
<div class="line"><a id="l00564" name="l00564"></a><span class="lineno">  564</span>    cond_ptr = &amp;mq_hdr-&gt;m_cond_recv;</div>
<div class="line"><a id="l00565" name="l00565"></a><span class="lineno">  565</span>  }</div>
<div class="line"><a id="l00566" name="l00566"></a><span class="lineno">  566</span>  <span class="keyword">auto</span>&amp; interrupting = *interrupting_ptr;</div>
<div class="line"><a id="l00567" name="l00567"></a><span class="lineno">  567</span>  <span class="keyword">auto</span>&amp; cond = *cond_ptr;</div>
<div class="line"><a id="l00568" name="l00568"></a><span class="lineno">  568</span> </div>
<div class="line"><a id="l00569" name="l00569"></a><span class="lineno">  569</span>  {</div>
<div class="line"><a id="l00570" name="l00570"></a><span class="lineno">  570</span>    Bipc_mq_lock lock(mq_hdr-&gt;m_mutex);</div>
<div class="line"><a id="l00571" name="l00571"></a><span class="lineno">  571</span> </div>
<div class="line"><a id="l00572" name="l00572"></a><span class="lineno">  572</span>    <span class="keywordflow">if</span> (interrupting == ON_ELSE_OFF)</div>
<div class="line"><a id="l00573" name="l00573"></a><span class="lineno">  573</span>    {</div>
<div class="line"><a id="l00574" name="l00574"></a><span class="lineno">  574</span>      FLOW_LOG_WARNING(<span class="stringliteral">&quot;Bipc_mq_handle [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Interrupt mode already set for &quot;</span></div>
<div class="line"><a id="l00575" name="l00575"></a><span class="lineno">  575</span>                       <span class="stringliteral">&quot;snd_else_rcv [&quot;</span> &lt;&lt; SND_ELSE_RCV &lt;&lt; <span class="stringliteral">&quot;], on_else_off [&quot;</span> &lt;&lt; ON_ELSE_OFF &lt;&lt; <span class="stringliteral">&quot;].  Ignoring.&quot;</span>);</div>
<div class="line"><a id="l00576" name="l00576"></a><span class="lineno">  576</span>      <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00577" name="l00577"></a><span class="lineno">  577</span>    }</div>
<div class="line"><a id="l00578" name="l00578"></a><span class="lineno">  578</span>    <span class="comment">// else</span></div>
<div class="line"><a id="l00579" name="l00579"></a><span class="lineno">  579</span> </div>
<div class="line"><a id="l00580" name="l00580"></a><span class="lineno">  580</span>    interrupting = ON_ELSE_OFF;</div>
<div class="line"><a id="l00581" name="l00581"></a><span class="lineno">  581</span>    FLOW_LOG_INFO(<span class="stringliteral">&quot;Bipc_mq_handle [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Interrupt mode set for &quot;</span></div>
<div class="line"><a id="l00582" name="l00582"></a><span class="lineno">  582</span>                  <span class="stringliteral">&quot;snd_else_rcv [&quot;</span> &lt;&lt; SND_ELSE_RCV &lt;&lt; <span class="stringliteral">&quot;], on_else_off [&quot;</span> &lt;&lt; ON_ELSE_OFF &lt;&lt; <span class="stringliteral">&quot;].  If on -- we &quot;</span></div>
<div class="line"><a id="l00583" name="l00583"></a><span class="lineno">  583</span>                  <span class="stringliteral">&quot;shall now ping the associated condition variable to wake up any ongoing waits.&quot;</span>);</div>
<div class="line"><a id="l00584" name="l00584"></a><span class="lineno">  584</span> </div>
<div class="line"><a id="l00585" name="l00585"></a><span class="lineno">  585</span>    <span class="keywordflow">if</span> <span class="keyword">constexpr</span>(ON_ELSE_OFF)</div>
<div class="line"><a id="l00586" name="l00586"></a><span class="lineno">  586</span>    {</div>
<div class="line"><a id="l00587" name="l00587"></a><span class="lineno">  587</span>      <span class="comment">/* *All* ongoing waits shall be woken up.  Each one will auto-re-lock mq_hdr-&gt;m_mutex and query</span></div>
<div class="line"><a id="l00588" name="l00588"></a><span class="lineno">  588</span><span class="comment">       * their local m_interrupting_*.  (Note: If `*this` wakes up, it&#39;ll see it&#39;s `true`.  If another</span></div>
<div class="line"><a id="l00589" name="l00589"></a><span class="lineno">  589</span><span class="comment">       * one wakes up, it will probably see `false` and re-enter the wait.  If by some coincidence that non-`*this`</span></div>
<div class="line"><a id="l00590" name="l00590"></a><span class="lineno">  590</span><span class="comment">       * had just set *that* m_interrupting_*, then -- well, cool -- presumably we won a race against</span></div>
<div class="line"><a id="l00591" name="l00591"></a><span class="lineno">  591</span><span class="comment">       * their own interrupt_allow_impl() doing the same thing. */</span></div>
<div class="line"><a id="l00592" name="l00592"></a><span class="lineno">  592</span>      cond.notify_all(); <span class="comment">// By the docs, and even by the source code as of Boost-1.81, this does not throw.</span></div>
<div class="line"><a id="l00593" name="l00593"></a><span class="lineno">  593</span> </div>
<div class="line"><a id="l00594" name="l00594"></a><span class="lineno">  594</span>      <span class="comment">/* (bipc::message_queue code does .notify_one() in send/receive impl, which makes sense since one</span></div>
<div class="line"><a id="l00595" name="l00595"></a><span class="lineno">  595</span><span class="comment">       * message/one empty space would be used by at most one blocked dude.  It also does it outside the mutex lock,</span></div>
<div class="line"><a id="l00596" name="l00596"></a><span class="lineno">  596</span><span class="comment">       * citing performance at the cost of occasional spurious wakeups.  Neither thing applies to us, so let&#39;s</span></div>
<div class="line"><a id="l00597" name="l00597"></a><span class="lineno">  597</span><span class="comment">       * .notify_all() and keep it simple inside the locked section. */</span></div>
<div class="line"><a id="l00598" name="l00598"></a><span class="lineno">  598</span>    } <span class="comment">// if constexpr(ON_ELSE_OFF)</span></div>
<div class="line"><a id="l00599" name="l00599"></a><span class="lineno">  599</span>    <span class="comment">/* else if constexpr(!ON_ELSE_OFF)</span></div>
<div class="line"><a id="l00600" name="l00600"></a><span class="lineno">  600</span><span class="comment">     * { We&#39;re good!  No need to wake anyone up to tell them... not to stop. } */</span></div>
<div class="line"><a id="l00601" name="l00601"></a><span class="lineno">  601</span>  } <span class="comment">// Bipc_mq_lock lock(mq_hdr-&gt;m_mutex);</span></div>
<div class="line"><a id="l00602" name="l00602"></a><span class="lineno">  602</span> </div>
<div class="line"><a id="l00603" name="l00603"></a><span class="lineno">  603</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00604" name="l00604"></a><span class="lineno">  604</span>} <span class="comment">// Bipc_mq_handle::interrupt_allow_impl()</span></div>
<div class="line"><a id="l00605" name="l00605"></a><span class="lineno">  605</span> </div>
<div class="line"><a id="l00606" name="l00606"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a40a750e20cb4696cdb7dc6cdddc78b1a">  606</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a40a750e20cb4696cdb7dc6cdddc78b1a">Bipc_mq_handle::interrupt_sends</a>()</div>
<div class="line"><a id="l00607" name="l00607"></a><span class="lineno">  607</span>{</div>
<div class="line"><a id="l00608" name="l00608"></a><span class="lineno">  608</span>  <span class="keywordflow">return</span> interrupt_allow_impl&lt;true, true&gt;();</div>
<div class="line"><a id="l00609" name="l00609"></a><span class="lineno">  609</span>}</div>
<div class="line"><a id="l00610" name="l00610"></a><span class="lineno">  610</span> </div>
<div class="line"><a id="l00611" name="l00611"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a7993a816c819b51af70d5ab775d41f8f">  611</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a7993a816c819b51af70d5ab775d41f8f">Bipc_mq_handle::allow_sends</a>()</div>
<div class="line"><a id="l00612" name="l00612"></a><span class="lineno">  612</span>{</div>
<div class="line"><a id="l00613" name="l00613"></a><span class="lineno">  613</span>  <span class="keywordflow">return</span> interrupt_allow_impl&lt;true, false&gt;();</div>
<div class="line"><a id="l00614" name="l00614"></a><span class="lineno">  614</span>}</div>
<div class="line"><a id="l00615" name="l00615"></a><span class="lineno">  615</span> </div>
<div class="line"><a id="l00616" name="l00616"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a84db01ec0b3dadaa7368df4fad8f8529">  616</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a84db01ec0b3dadaa7368df4fad8f8529">Bipc_mq_handle::interrupt_receives</a>()</div>
<div class="line"><a id="l00617" name="l00617"></a><span class="lineno">  617</span>{</div>
<div class="line"><a id="l00618" name="l00618"></a><span class="lineno">  618</span>  <span class="keywordflow">return</span> interrupt_allow_impl&lt;false, true&gt;();</div>
<div class="line"><a id="l00619" name="l00619"></a><span class="lineno">  619</span>}</div>
<div class="line"><a id="l00620" name="l00620"></a><span class="lineno">  620</span> </div>
<div class="line"><a id="l00621" name="l00621"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a02e3582a466ed25128d35d3c767259cf">  621</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a02e3582a466ed25128d35d3c767259cf">Bipc_mq_handle::allow_receives</a>()</div>
<div class="line"><a id="l00622" name="l00622"></a><span class="lineno">  622</span>{</div>
<div class="line"><a id="l00623" name="l00623"></a><span class="lineno">  623</span>  <span class="keywordflow">return</span> interrupt_allow_impl&lt;false, false&gt;();</div>
<div class="line"><a id="l00624" name="l00624"></a><span class="lineno">  624</span>}</div>
<div class="line"><a id="l00625" name="l00625"></a><span class="lineno">  625</span> </div>
<div class="line"><a id="l00626" name="l00626"></a><span class="lineno">  626</span><span class="keyword">template</span>&lt;Bipc_mq_handle::Wait_type WAIT_TYPE, <span class="keywordtype">bool</span> SND_ELSE_RCV&gt;</div>
<div class="line"><a id="l00627" name="l00627"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Bipc__mq__handle.html#ada9cf828123f98f5bb66236e5446d37d">  627</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#ada9cf828123f98f5bb66236e5446d37d">Bipc_mq_handle::wait_impl</a>([[maybe_unused]] <a class="code hl_typedef" href="namespaceipc_1_1util.html#ac66141280c3b7295a86b65209f31cc58">util::Fine_duration</a> timeout_from_now, <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code)</div>
<div class="line"><a id="l00628" name="l00628"></a><span class="lineno">  628</span>{</div>
<div class="line"><a id="l00629" name="l00629"></a><span class="lineno">  629</span>  <span class="keyword">using </span><a class="code hl_typedef" href="namespaceipc_1_1util.html#aa3808edfc4d59bce4b9800d6a60026d3">util::Fine_time_pt</a>;</div>
<div class="line"><a id="l00630" name="l00630"></a><span class="lineno">  630</span>  <span class="keyword">using </span>flow::util::time_since_posix_epoch;</div>
<div class="line"><a id="l00631" name="l00631"></a><span class="lineno">  631</span>  <span class="keyword">using </span>boost::chrono::round;</div>
<div class="line"><a id="l00632" name="l00632"></a><span class="lineno">  632</span>  <span class="keyword">using </span>boost::chrono::microseconds;</div>
<div class="line"><a id="l00633" name="l00633"></a><span class="lineno">  633</span>  <span class="keyword">using </span>Classic_shm_area = bipc::ipcdetail::managed_open_or_create_impl&lt;bipc::shared_memory_object, 0, true, false&gt;;</div>
<div class="line"><a id="l00634" name="l00634"></a><span class="lineno">  634</span>  <span class="keyword">using </span>Bipc_mq = bipc::message_queue;</div>
<div class="line"><a id="l00635" name="l00635"></a><span class="lineno">  635</span>  <span class="keyword">using </span>Bipc_mq_hdr = bipc::ipcdetail::mq_hdr_t&lt;Bipc_mq::void_pointer&gt;;</div>
<div class="line"><a id="l00636" name="l00636"></a><span class="lineno">  636</span>  <span class="keyword">using </span>Bipc_mq_mtx = bipc::interprocess_mutex;</div>
<div class="line"><a id="l00637" name="l00637"></a><span class="lineno">  637</span>  <span class="keyword">using </span>Bipc_mq_lock = bipc::scoped_lock&lt;Bipc_mq_mtx&gt;;</div>
<div class="line"><a id="l00638" name="l00638"></a><span class="lineno">  638</span> </div>
<div class="line"><a id="l00639" name="l00639"></a><span class="lineno">  639</span>  FLOW_ERROR_EXEC_AND_THROW_ON_ERROR(<span class="keywordtype">bool</span>, (wait_impl&lt;WAIT_TYPE, SND_ELSE_RCV&gt;), timeout_from_now, _1);</div>
<div class="line"><a id="l00640" name="l00640"></a><span class="lineno">  640</span>  <span class="comment">// ^-- Call ourselves and return if err_code is null.  If got to present line, err_code is not null.</span></div>
<div class="line"><a id="l00641" name="l00641"></a><span class="lineno">  641</span> </div>
<div class="line"><a id="l00642" name="l00642"></a><span class="lineno">  642</span>  assert(<a class="code hl_variable" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a152b99bc327c774553e9b90a5f0bc4d3">m_mq</a></div>
<div class="line"><a id="l00643" name="l00643"></a><span class="lineno">  643</span>         &amp;&amp; <span class="stringliteral">&quot;As advertised: wait_impl() =&gt; undefined behavior if not successfully cted or was moved-from.&quot;</span>);</div>
<div class="line"><a id="l00644" name="l00644"></a><span class="lineno">  644</span> </div>
<div class="line"><a id="l00645" name="l00645"></a><span class="lineno">  645</span>  [[maybe_unused]] <a class="code hl_typedef" href="namespaceipc_1_1util.html#aa3808edfc4d59bce4b9800d6a60026d3">Fine_time_pt</a> timeout_since_epoch;</div>
<div class="line"><a id="l00646" name="l00646"></a><span class="lineno">  646</span>  <span class="keywordflow">if</span> <span class="keyword">constexpr</span>(WAIT_TYPE == <a class="code hl_enumvalue" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a7cf68a89774c790d07239fdc9a8c276ba79150ec67147b158048b519ce844aedb">Wait_type::S_TIMED_WAIT</a>)</div>
<div class="line"><a id="l00647" name="l00647"></a><span class="lineno">  647</span>  {</div>
<div class="line"><a id="l00648" name="l00648"></a><span class="lineno">  648</span>    timeout_since_epoch = <a class="code hl_typedef" href="namespaceipc_1_1util.html#aa3808edfc4d59bce4b9800d6a60026d3">Fine_time_pt</a>(time_since_posix_epoch() + timeout_from_now);</div>
<div class="line"><a id="l00649" name="l00649"></a><span class="lineno">  649</span>  }</div>
<div class="line"><a id="l00650" name="l00650"></a><span class="lineno">  650</span> </div>
<div class="line"><a id="l00651" name="l00651"></a><span class="lineno">  651</span>  <span class="comment">/* Most likely the below code will elicit a &quot;WTF.&quot;  The background is that bipc::message_queue lacks anything like</span></div>
<div class="line"><a id="l00652" name="l00652"></a><span class="lineno">  652</span><span class="comment">   * wait_impl().  It seems to mimic the mq_*() API.  However mq_*() does have it, in Linux, because mq_t is an FD,</span></div>
<div class="line"><a id="l00653" name="l00653"></a><span class="lineno">  653</span><span class="comment">   * and it can be used with epoll_*(), so that is what Posix_mq_handle uses.  To get the same thing here I had</span></div>
<div class="line"><a id="l00654" name="l00654"></a><span class="lineno">  654</span><span class="comment">   * to hack it as seen below.  What it does is it mimics *send() and *receive() internal Boost source code, but</span></div>
<div class="line"><a id="l00655" name="l00655"></a><span class="lineno">  655</span><span class="comment">   * it stops short of actually performing the read or write once the queue becomes pushable/poppable.</span></div>
<div class="line"><a id="l00656" name="l00656"></a><span class="lineno">  656</span><span class="comment">   * To get it work I (ygoldfel) operate directly on their internal data structures, same as those methods do.</span></div>
<div class="line"><a id="l00657" name="l00657"></a><span class="lineno">  657</span><span class="comment">   * Normally this would be beyond the pale; however in this case a couple of points make it reasonable-enough.</span></div>
<div class="line"><a id="l00658" name="l00658"></a><span class="lineno">  658</span><span class="comment">   *</span></div>
<div class="line"><a id="l00659" name="l00659"></a><span class="lineno">  659</span><span class="comment">   * Firstly, we can even do it in the first place, because the data structures -- all of which are directly in</span></div>
<div class="line"><a id="l00660" name="l00660"></a><span class="lineno">  660</span><span class="comment">   * SHM -- `public`ly expose their data members (though, interestingly, not the methods; however the methods</span></div>
<div class="line"><a id="l00661" name="l00661"></a><span class="lineno">  661</span><span class="comment">   * are very basic wrappers around public things like condition variables and mutexes).  This fact is suggestive</span></div>
<div class="line"><a id="l00662" name="l00662"></a><span class="lineno">  662</span><span class="comment">   * of this being intentionally possible.</span></div>
<div class="line"><a id="l00663" name="l00663"></a><span class="lineno">  663</span><span class="comment">   *</span></div>
<div class="line"><a id="l00664" name="l00664"></a><span class="lineno">  664</span><span class="comment">   * Secondly, and this is the main reason I consider this reasonably maintainable, is the fact that the code</span></div>
<div class="line"><a id="l00665" name="l00665"></a><span class="lineno">  665</span><span class="comment">   * itself -- including a comment above the BOOST_INTERPROCESS_MSG_QUEUE_CIRCULAR_INDEX define -- says that</span></div>
<div class="line"><a id="l00666" name="l00666"></a><span class="lineno">  666</span><span class="comment">   * their goal was to make version A of bipc interoperable (this is IPC after all) if version B&gt;A of bipc.</span></div>
<div class="line"><a id="l00667" name="l00667"></a><span class="lineno">  667</span><span class="comment">   * That means that if they *do* change this stuff, it will be protected by #define(s) like</span></div>
<div class="line"><a id="l00668" name="l00668"></a><span class="lineno">  668</span><span class="comment">   * BOOST_INTERPROCESS_MSG_QUEUE_CIRCULAR_INDEX, so as to make any change possible to roll-back via a compile</span></div>
<div class="line"><a id="l00669" name="l00669"></a><span class="lineno">  669</span><span class="comment">   * flag.  They *could* rename a data member without changing the physical structures, in which case this</span></div>
<div class="line"><a id="l00670" name="l00670"></a><span class="lineno">  670</span><span class="comment">   * would stop building, but that seems unlikely, as Boost updates are not made willy-nilly.</span></div>
<div class="line"><a id="l00671" name="l00671"></a><span class="lineno">  671</span><span class="comment">   *</span></div>
<div class="line"><a id="l00672" name="l00672"></a><span class="lineno">  672</span><span class="comment">   * Is there risk of this breaking with a newer Boost version?  Yes, but the above evidence shows the risk is</span></div>
<div class="line"><a id="l00673" name="l00673"></a><span class="lineno">  673</span><span class="comment">   * manageably low.  Note that this wait_impl() feature, particularly since I&#39;ve made it interruptible, is quite</span></div>
<div class="line"><a id="l00674" name="l00674"></a><span class="lineno">  674</span><span class="comment">   * useful.  Without it one must used timed_*(), and even with that -- suppose we want to stop work on</span></div>
<div class="line"><a id="l00675" name="l00675"></a><span class="lineno">  675</span><span class="comment">   * a queue from another thread -- we have to put up a deinit time equal to the fine-grainedness of the timeout</span></div>
<div class="line"><a id="l00676" name="l00676"></a><span class="lineno">  676</span><span class="comment">   * one would have to use.  Plus even that aside, it is annoying to have to break up an operation into smaller</span></div>
<div class="line"><a id="l00677" name="l00677"></a><span class="lineno">  677</span><span class="comment">   * ones. */</span></div>
<div class="line"><a id="l00678" name="l00678"></a><span class="lineno">  678</span> </div>
<div class="line"><a id="l00679" name="l00679"></a><span class="lineno">  679</span>  <span class="keywordflow">if</span> <span class="keyword">constexpr</span>(WAIT_TYPE == <a class="code hl_enumvalue" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a7cf68a89774c790d07239fdc9a8c276baabe6e70a3755b7e53cb97edeb91217f8">Wait_type::S_POLL</a>)</div>
<div class="line"><a id="l00680" name="l00680"></a><span class="lineno">  680</span>  {</div>
<div class="line"><a id="l00681" name="l00681"></a><span class="lineno">  681</span>    FLOW_LOG_TRACE(<span class="stringliteral">&quot;Bipc_mq_handle [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Poll-unstarved for snd_else_rcv [&quot;</span> &lt;&lt; SND_ELSE_RCV &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00682" name="l00682"></a><span class="lineno">  682</span>  }</div>
<div class="line"><a id="l00683" name="l00683"></a><span class="lineno">  683</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> <span class="keyword">constexpr</span>(WAIT_TYPE == <a class="code hl_enumvalue" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a7cf68a89774c790d07239fdc9a8c276ba79150ec67147b158048b519ce844aedb">Wait_type::S_TIMED_WAIT</a>)</div>
<div class="line"><a id="l00684" name="l00684"></a><span class="lineno">  684</span>  {</div>
<div class="line"><a id="l00685" name="l00685"></a><span class="lineno">  685</span>    FLOW_LOG_TRACE(<span class="stringliteral">&quot;Bipc_mq_handle [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Blocking-timed-await-unstarved for &quot;</span></div>
<div class="line"><a id="l00686" name="l00686"></a><span class="lineno">  686</span>                   <span class="stringliteral">&quot;snd_else_rcv [&quot;</span> &lt;&lt; SND_ELSE_RCV &lt;&lt; <span class="stringliteral">&quot;]; &quot;</span></div>
<div class="line"><a id="l00687" name="l00687"></a><span class="lineno">  687</span>                   <span class="stringliteral">&quot;timeout ~[&quot;</span> &lt;&lt; round&lt;microseconds&gt;(timeout_from_now) &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00688" name="l00688"></a><span class="lineno">  688</span>  }</div>
<div class="line"><a id="l00689" name="l00689"></a><span class="lineno">  689</span>  <span class="keywordflow">else</span></div>
<div class="line"><a id="l00690" name="l00690"></a><span class="lineno">  690</span>  {</div>
<div class="line"><a id="l00691" name="l00691"></a><span class="lineno">  691</span>    <span class="keyword">static_assert</span>(WAIT_TYPE == <a class="code hl_enumvalue" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a7cf68a89774c790d07239fdc9a8c276ba92fdc9b0bcae1fd8fd720b47bdc63bcc">Wait_type::S_WAIT</a>, <span class="stringliteral">&quot;What!&quot;</span>);</div>
<div class="line"><a id="l00692" name="l00692"></a><span class="lineno">  692</span>    FLOW_LOG_TRACE(<span class="stringliteral">&quot;Bipc_mq_handle [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Blocking-await-unstarved for snd_else_rcv &quot;</span></div>
<div class="line"><a id="l00693" name="l00693"></a><span class="lineno">  693</span>                   <span class="stringliteral">&quot;[&quot;</span> &lt;&lt; SND_ELSE_RCV &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00694" name="l00694"></a><span class="lineno">  694</span>  }</div>
<div class="line"><a id="l00695" name="l00695"></a><span class="lineno">  695</span> </div>
<div class="line"><a id="l00696" name="l00696"></a><span class="lineno">  696</span>  <span class="keyword">auto</span>&amp; shm_area = <span class="keyword">reinterpret_cast&lt;</span>Classic_shm_area&amp;<span class="keyword">&gt;</span>(*m_mq);</div>
<div class="line"><a id="l00697" name="l00697"></a><span class="lineno">  697</span>  <span class="keyword">auto</span>* <span class="keyword">const</span> mq_hdr = <span class="keyword">static_cast&lt;</span>Bipc_mq_hdr*<span class="keyword">&gt;</span>(shm_area.get_user_address());</div>
<div class="line"><a id="l00698" name="l00698"></a><span class="lineno">  698</span>  <span class="keywordtype">size_t</span>* blocked_dudes_ptr;</div>
<div class="line"><a id="l00699" name="l00699"></a><span class="lineno">  699</span>  <span class="keywordtype">bool</span>* interrupting_ptr;</div>
<div class="line"><a id="l00700" name="l00700"></a><span class="lineno">  700</span>  <span class="keyword">decltype</span>(mq_hdr-&gt;m_cond_recv)* cond_ptr;</div>
<div class="line"><a id="l00701" name="l00701"></a><span class="lineno">  701</span>  <span class="keywordflow">if</span> <span class="keyword">constexpr</span>(SND_ELSE_RCV)</div>
<div class="line"><a id="l00702" name="l00702"></a><span class="lineno">  702</span>  {</div>
<div class="line"><a id="l00703" name="l00703"></a><span class="lineno">  703</span>    blocked_dudes_ptr = &amp;mq_hdr-&gt;m_blocked_senders;</div>
<div class="line"><a id="l00704" name="l00704"></a><span class="lineno">  704</span>    cond_ptr = &amp;mq_hdr-&gt;m_cond_send;</div>
<div class="line"><a id="l00705" name="l00705"></a><span class="lineno">  705</span>    interrupting_ptr = &amp;<a class="code hl_variable" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a85fdfd6a739453c86298e05bb3a55341">m_interrupting_snd</a>;</div>
<div class="line"><a id="l00706" name="l00706"></a><span class="lineno">  706</span>  }</div>
<div class="line"><a id="l00707" name="l00707"></a><span class="lineno">  707</span>  <span class="keywordflow">else</span></div>
<div class="line"><a id="l00708" name="l00708"></a><span class="lineno">  708</span>  {</div>
<div class="line"><a id="l00709" name="l00709"></a><span class="lineno">  709</span>    blocked_dudes_ptr = &amp;mq_hdr-&gt;m_blocked_receivers;</div>
<div class="line"><a id="l00710" name="l00710"></a><span class="lineno">  710</span>    cond_ptr = &amp;mq_hdr-&gt;m_cond_recv;</div>
<div class="line"><a id="l00711" name="l00711"></a><span class="lineno">  711</span>    interrupting_ptr = &amp;<a class="code hl_variable" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a3eb1daea17bbfa332e6f50e4f6625bab">m_interrupting_rcv</a>;</div>
<div class="line"><a id="l00712" name="l00712"></a><span class="lineno">  712</span>  }</div>
<div class="line"><a id="l00713" name="l00713"></a><span class="lineno">  713</span>  <span class="keyword">auto</span>&amp; blocked_dudes = *blocked_dudes_ptr;</div>
<div class="line"><a id="l00714" name="l00714"></a><span class="lineno">  714</span>  <span class="keyword">auto</span>&amp; cond = *cond_ptr;</div>
<div class="line"><a id="l00715" name="l00715"></a><span class="lineno">  715</span>  <span class="keywordtype">bool</span>&amp; interrupting = *interrupting_ptr;</div>
<div class="line"><a id="l00716" name="l00716"></a><span class="lineno">  716</span> </div>
<div class="line"><a id="l00717" name="l00717"></a><span class="lineno">  717</span>  <span class="keyword">const</span> <span class="keyword">auto</span> is_starved_func = [&amp;]() -&gt; <span class="keywordtype">bool</span></div>
<div class="line"><a id="l00718" name="l00718"></a><span class="lineno">  718</span>  {</div>
<div class="line"><a id="l00719" name="l00719"></a><span class="lineno">  719</span>    <span class="keywordflow">if</span> <span class="keyword">constexpr</span>(SND_ELSE_RCV)</div>
<div class="line"><a id="l00720" name="l00720"></a><span class="lineno">  720</span>    {</div>
<div class="line"><a id="l00721" name="l00721"></a><span class="lineno">  721</span>      <span class="keywordflow">return</span> mq_hdr-&gt;m_cur_num_msg == mq_hdr-&gt;m_max_num_msg;</div>
<div class="line"><a id="l00722" name="l00722"></a><span class="lineno">  722</span>    }</div>
<div class="line"><a id="l00723" name="l00723"></a><span class="lineno">  723</span>    <span class="keywordflow">else</span></div>
<div class="line"><a id="l00724" name="l00724"></a><span class="lineno">  724</span>    {</div>
<div class="line"><a id="l00725" name="l00725"></a><span class="lineno">  725</span>      <span class="keywordflow">return</span> mq_hdr-&gt;m_cur_num_msg == 0;</div>
<div class="line"><a id="l00726" name="l00726"></a><span class="lineno">  726</span>    }</div>
<div class="line"><a id="l00727" name="l00727"></a><span class="lineno">  727</span>  }; <span class="comment">// const auto is_starved_func =</span></div>
<div class="line"><a id="l00728" name="l00728"></a><span class="lineno">  728</span> </div>
<div class="line"><a id="l00729" name="l00729"></a><span class="lineno">  729</span>  <span class="keywordtype">bool</span> interrupted = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00730" name="l00730"></a><span class="lineno">  730</span>  <span class="keywordtype">bool</span> not_starved;</div>
<div class="line"><a id="l00731" name="l00731"></a><span class="lineno">  731</span>  <span class="comment">/* Technically [timed_]wait() can throw, I guess if bool(mutex) is false.  Their internal code has a try{}</span></div>
<div class="line"><a id="l00732" name="l00732"></a><span class="lineno">  732</span><span class="comment">   * so why not. */</span></div>
<div class="line"><a id="l00733" name="l00733"></a><span class="lineno">  733</span>  <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a9948742d87298d5842d298de9c946c7c">op_with_possible_bipc_mq_exception</a>(err_code,</div>
<div class="line"><a id="l00734" name="l00734"></a><span class="lineno">  734</span>                                     <span class="stringliteral">&quot;Bipc_mq_handle::wait_impl(): &quot;</span></div>
<div class="line"><a id="l00735" name="l00735"></a><span class="lineno">  735</span>                                       <span class="stringliteral">&quot;bipc::interprocess_condition::[timed_]wait()&quot;</span>,</div>
<div class="line"><a id="l00736" name="l00736"></a><span class="lineno">  736</span>                                     [&amp;]()</div>
<div class="line"><a id="l00737" name="l00737"></a><span class="lineno">  737</span>  {</div>
<div class="line"><a id="l00738" name="l00738"></a><span class="lineno">  738</span><span class="preprocessor">#ifndef BOOST_INTERPROCESS_MSG_QUEUE_CIRCULAR_INDEX</span></div>
<div class="line"><a id="l00739" name="l00739"></a><span class="lineno">  739</span>    <span class="keyword">static_assert</span>(<span class="keyword">false</span>,</div>
<div class="line"><a id="l00740" name="l00740"></a><span class="lineno">  740</span>                  <span class="stringliteral">&quot;bipc comments show this shall be true as of many Boost versions ago, unless unset which &quot;</span></div>
<div class="line"><a id="l00741" name="l00741"></a><span class="lineno">  741</span>                    <span class="stringliteral">&quot;would decrease performance; and we do not do that.  Our code for simplicity assumes &quot;</span></div>
<div class="line"><a id="l00742" name="l00742"></a><span class="lineno">  742</span>                    <span class="stringliteral">&quot;it and does not support the lower-perf bipc MQ algorithm.&quot;</span>);</div>
<div class="line"><a id="l00743" name="l00743"></a><span class="lineno">  743</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00744" name="l00744"></a><span class="lineno">  744</span> </div>
<div class="line"><a id="l00745" name="l00745"></a><span class="lineno">  745</span>    {</div>
<div class="line"><a id="l00746" name="l00746"></a><span class="lineno">  746</span>      Bipc_mq_lock lock(mq_hdr-&gt;m_mutex);</div>
<div class="line"><a id="l00747" name="l00747"></a><span class="lineno">  747</span> </div>
<div class="line"><a id="l00748" name="l00748"></a><span class="lineno">  748</span>      <span class="comment">// See interrupt_allow_impl() to understand this check (also below on cond.*wait()).</span></div>
<div class="line"><a id="l00749" name="l00749"></a><span class="lineno">  749</span>      <span class="keywordflow">if</span> (interrupting)</div>
<div class="line"><a id="l00750" name="l00750"></a><span class="lineno">  750</span>      {</div>
<div class="line"><a id="l00751" name="l00751"></a><span class="lineno">  751</span>        FLOW_LOG_TRACE(<span class="stringliteral">&quot;Interrupted before wait/poll started (preemptively).&quot;</span>);</div>
<div class="line"><a id="l00752" name="l00752"></a><span class="lineno">  752</span>        interrupted = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00753" name="l00753"></a><span class="lineno">  753</span>        <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00754" name="l00754"></a><span class="lineno">  754</span>      }</div>
<div class="line"><a id="l00755" name="l00755"></a><span class="lineno">  755</span>      <span class="comment">// else</span></div>
<div class="line"><a id="l00756" name="l00756"></a><span class="lineno">  756</span> </div>
<div class="line"><a id="l00757" name="l00757"></a><span class="lineno">  757</span>      <span class="keywordflow">if</span> (is_starved_func())</div>
<div class="line"><a id="l00758" name="l00758"></a><span class="lineno">  758</span>      {</div>
<div class="line"><a id="l00759" name="l00759"></a><span class="lineno">  759</span>        <span class="comment">// timed_receive() would INFO-log here, but let&#39;s not slow things down while the bipc MQ mutex is locked.</span></div>
<div class="line"><a id="l00760" name="l00760"></a><span class="lineno">  760</span> </div>
<div class="line"><a id="l00761" name="l00761"></a><span class="lineno">  761</span>        <span class="keywordflow">if</span> <span class="keyword">constexpr</span>(WAIT_TYPE == <a class="code hl_enumvalue" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a7cf68a89774c790d07239fdc9a8c276baabe6e70a3755b7e53cb97edeb91217f8">Wait_type::S_POLL</a>)</div>
<div class="line"><a id="l00762" name="l00762"></a><span class="lineno">  762</span>        {</div>
<div class="line"><a id="l00763" name="l00763"></a><span class="lineno">  763</span>          FLOW_LOG_TRACE(<span class="stringliteral">&quot;Not immediatelly unstarved.  Poll = done.&quot;</span>);</div>
<div class="line"><a id="l00764" name="l00764"></a><span class="lineno">  764</span>          not_starved = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00765" name="l00765"></a><span class="lineno">  765</span>          <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00766" name="l00766"></a><span class="lineno">  766</span>        }</div>
<div class="line"><a id="l00767" name="l00767"></a><span class="lineno">  767</span>        <span class="keywordflow">else</span> <span class="comment">// if constexpr(WAIT_TYPE == Wait_type::S_[TIMED_]WAIT)</span></div>
<div class="line"><a id="l00768" name="l00768"></a><span class="lineno">  768</span>        {</div>
<div class="line"><a id="l00769" name="l00769"></a><span class="lineno">  769</span>          FLOW_LOG_TRACE(<span class="stringliteral">&quot;Not immediatelly unstarved.  Awaiting unstarvedness or timeout.&quot;</span>);</div>
<div class="line"><a id="l00770" name="l00770"></a><span class="lineno">  770</span> </div>
<div class="line"><a id="l00771" name="l00771"></a><span class="lineno">  771</span>          ++blocked_dudes;</div>
<div class="line"><a id="l00772" name="l00772"></a><span class="lineno">  772</span>          <span class="keywordflow">try</span></div>
<div class="line"><a id="l00773" name="l00773"></a><span class="lineno">  773</span>          {</div>
<div class="line"><a id="l00774" name="l00774"></a><span class="lineno">  774</span>            <span class="keywordflow">do</span></div>
<div class="line"><a id="l00775" name="l00775"></a><span class="lineno">  775</span>            {</div>
<div class="line"><a id="l00776" name="l00776"></a><span class="lineno">  776</span>              <span class="keywordflow">if</span> <span class="keyword">constexpr</span>(WAIT_TYPE == <a class="code hl_enumvalue" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a7cf68a89774c790d07239fdc9a8c276ba92fdc9b0bcae1fd8fd720b47bdc63bcc">Wait_type::S_WAIT</a>)</div>
<div class="line"><a id="l00777" name="l00777"></a><span class="lineno">  777</span>              {</div>
<div class="line"><a id="l00778" name="l00778"></a><span class="lineno">  778</span>                cond.wait(lock);</div>
<div class="line"><a id="l00779" name="l00779"></a><span class="lineno">  779</span> </div>
<div class="line"><a id="l00780" name="l00780"></a><span class="lineno">  780</span>                <span class="comment">// See interrupt_allow_impl() to understand this check (also above).</span></div>
<div class="line"><a id="l00781" name="l00781"></a><span class="lineno">  781</span>                <span class="keywordflow">if</span> (interrupting)</div>
<div class="line"><a id="l00782" name="l00782"></a><span class="lineno">  782</span>                {</div>
<div class="line"><a id="l00783" name="l00783"></a><span class="lineno">  783</span>                  FLOW_LOG_TRACE(<span class="stringliteral">&quot;Interruption detected upon waking up from wait (interrupted concurrently).&quot;</span>);</div>
<div class="line"><a id="l00784" name="l00784"></a><span class="lineno">  784</span>                  --blocked_dudes;</div>
<div class="line"><a id="l00785" name="l00785"></a><span class="lineno">  785</span>                  interrupted = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00786" name="l00786"></a><span class="lineno">  786</span>                  <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00787" name="l00787"></a><span class="lineno">  787</span>                }</div>
<div class="line"><a id="l00788" name="l00788"></a><span class="lineno">  788</span>                <span class="comment">// else: Another loop iteration.</span></div>
<div class="line"><a id="l00789" name="l00789"></a><span class="lineno">  789</span>              }</div>
<div class="line"><a id="l00790" name="l00790"></a><span class="lineno">  790</span>              <span class="keywordflow">else</span> <span class="comment">// if (WAIT_TYPE==TIMED_WAIT)</span></div>
<div class="line"><a id="l00791" name="l00791"></a><span class="lineno">  791</span>              {</div>
<div class="line"><a id="l00792" name="l00792"></a><span class="lineno">  792</span>                <span class="keyword">static_assert</span>(WAIT_TYPE == <a class="code hl_enumvalue" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a7cf68a89774c790d07239fdc9a8c276ba79150ec67147b158048b519ce844aedb">Wait_type::S_TIMED_WAIT</a>, <span class="stringliteral">&quot;The hell?&quot;</span>);</div>
<div class="line"><a id="l00793" name="l00793"></a><span class="lineno">  793</span> </div>
<div class="line"><a id="l00794" name="l00794"></a><span class="lineno">  794</span>                <span class="keyword">const</span> <span class="keywordtype">bool</span> wait_result = cond.timed_wait(lock, timeout_since_epoch); <span class="comment">// Lock unlocked throughout wait.</span></div>
<div class="line"><a id="l00795" name="l00795"></a><span class="lineno">  795</span> </div>
<div class="line"><a id="l00796" name="l00796"></a><span class="lineno">  796</span>                <span class="comment">// See interrupt_allow_impl() to understand this check (also above).</span></div>
<div class="line"><a id="l00797" name="l00797"></a><span class="lineno">  797</span>                <span class="keywordflow">if</span> (interrupting)</div>
<div class="line"><a id="l00798" name="l00798"></a><span class="lineno">  798</span>                {</div>
<div class="line"><a id="l00799" name="l00799"></a><span class="lineno">  799</span>                  FLOW_LOG_TRACE(<span class="stringliteral">&quot;Interruption detected upon waking up from wait (interrupted concurrently).&quot;</span>);</div>
<div class="line"><a id="l00800" name="l00800"></a><span class="lineno">  800</span>                  --blocked_dudes;</div>
<div class="line"><a id="l00801" name="l00801"></a><span class="lineno">  801</span>                  interrupted = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00802" name="l00802"></a><span class="lineno">  802</span>                  <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00803" name="l00803"></a><span class="lineno">  803</span>                }</div>
<div class="line"><a id="l00804" name="l00804"></a><span class="lineno">  804</span>                <span class="comment">// else</span></div>
<div class="line"><a id="l00805" name="l00805"></a><span class="lineno">  805</span> </div>
<div class="line"><a id="l00806" name="l00806"></a><span class="lineno">  806</span>                <span class="keywordflow">if</span> (!wait_result)</div>
<div class="line"><a id="l00807" name="l00807"></a><span class="lineno">  807</span>                {</div>
<div class="line"><a id="l00808" name="l00808"></a><span class="lineno">  808</span>                  <span class="comment">// Timeout reached.</span></div>
<div class="line"><a id="l00809" name="l00809"></a><span class="lineno">  809</span>                  <span class="keywordflow">if</span> (is_starved_func())</div>
<div class="line"><a id="l00810" name="l00810"></a><span class="lineno">  810</span>                  {</div>
<div class="line"><a id="l00811" name="l00811"></a><span class="lineno">  811</span>                    <span class="comment">// Timeout reached; still starved.  Done (exit algo).</span></div>
<div class="line"><a id="l00812" name="l00812"></a><span class="lineno">  812</span>                    --blocked_dudes;</div>
<div class="line"><a id="l00813" name="l00813"></a><span class="lineno">  813</span>                    not_starved = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00814" name="l00814"></a><span class="lineno">  814</span>                    <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00815" name="l00815"></a><span class="lineno">  815</span>                  }</div>
<div class="line"><a id="l00816" name="l00816"></a><span class="lineno">  816</span>                  <span class="comment">// else: Timeout reached; *is* unstarved.  Done (exit loop -- no need to recheck is_starved_func()).</span></div>
<div class="line"><a id="l00817" name="l00817"></a><span class="lineno">  817</span>                  <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00818" name="l00818"></a><span class="lineno">  818</span>                } <span class="comment">// if (!wait_result)</span></div>
<div class="line"><a id="l00819" name="l00819"></a><span class="lineno">  819</span>                <span class="comment">// else: Timeout not reached; probably *is* unstarved; but check it as loop exit condition.</span></div>
<div class="line"><a id="l00820" name="l00820"></a><span class="lineno">  820</span>              } <span class="comment">// else if (WAIT_TYPE==TIMED_WAIT)</span></div>
<div class="line"><a id="l00821" name="l00821"></a><span class="lineno">  821</span>            }</div>
<div class="line"><a id="l00822" name="l00822"></a><span class="lineno">  822</span>            <span class="keywordflow">while</span> (is_starved_func());</div>
<div class="line"><a id="l00823" name="l00823"></a><span class="lineno">  823</span>          } <span class="comment">// try</span></div>
<div class="line"><a id="l00824" name="l00824"></a><span class="lineno">  824</span>          <span class="keywordflow">catch</span> (...)</div>
<div class="line"><a id="l00825" name="l00825"></a><span class="lineno">  825</span>          {</div>
<div class="line"><a id="l00826" name="l00826"></a><span class="lineno">  826</span>            --blocked_dudes;</div>
<div class="line"><a id="l00827" name="l00827"></a><span class="lineno">  827</span>            <span class="keywordflow">throw</span>;</div>
<div class="line"><a id="l00828" name="l00828"></a><span class="lineno">  828</span>          }</div>
<div class="line"><a id="l00829" name="l00829"></a><span class="lineno">  829</span>          --blocked_dudes;</div>
<div class="line"><a id="l00830" name="l00830"></a><span class="lineno">  830</span>        } <span class="comment">// else if constexpr(WAIT_TYPE == Wait_type::S_[TIMED_]WAIT)</span></div>
<div class="line"><a id="l00831" name="l00831"></a><span class="lineno">  831</span> </div>
<div class="line"><a id="l00832" name="l00832"></a><span class="lineno">  832</span>        <span class="comment">// Will INFO-log shortly (outside lock).</span></div>
<div class="line"><a id="l00833" name="l00833"></a><span class="lineno">  833</span>        not_starved = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00834" name="l00834"></a><span class="lineno">  834</span>      } <span class="comment">// if (is_starved_func())</span></div>
<div class="line"><a id="l00835" name="l00835"></a><span class="lineno">  835</span>      <span class="keywordflow">else</span></div>
<div class="line"><a id="l00836" name="l00836"></a><span class="lineno">  836</span>      {</div>
<div class="line"><a id="l00837" name="l00837"></a><span class="lineno">  837</span>        FLOW_LOG_TRACE(<span class="stringliteral">&quot;Immediately unstarved.&quot;</span>);</div>
<div class="line"><a id="l00838" name="l00838"></a><span class="lineno">  838</span>        not_starved = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00839" name="l00839"></a><span class="lineno">  839</span>      }</div>
<div class="line"><a id="l00840" name="l00840"></a><span class="lineno">  840</span>    } <span class="comment">// Bipc_mq_lock lock(mq_hdr-&gt;m_mutex);</span></div>
<div class="line"><a id="l00841" name="l00841"></a><span class="lineno">  841</span>  }); <span class="comment">// op_with_possible_bipc_mq_exception()</span></div>
<div class="line"><a id="l00842" name="l00842"></a><span class="lineno">  842</span> </div>
<div class="line"><a id="l00843" name="l00843"></a><span class="lineno">  843</span>  <span class="keywordflow">if</span> ((!*err_code) &amp;&amp; interrupted)</div>
<div class="line"><a id="l00844" name="l00844"></a><span class="lineno">  844</span>  {</div>
<div class="line"><a id="l00845" name="l00845"></a><span class="lineno">  845</span>    FLOW_LOG_INFO(<span class="stringliteral">&quot;Bipc_mq_handle [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Poll/wait/timed-wait-unstarved for &quot;</span></div>
<div class="line"><a id="l00846" name="l00846"></a><span class="lineno">  846</span>                  <span class="stringliteral">&quot;snd_else_rcv [&quot;</span> &lt;&lt; SND_ELSE_RCV &lt;&lt; <span class="stringliteral">&quot;]: interrupted (TRACE message -- if visible -- &quot;</span></div>
<div class="line"><a id="l00847" name="l00847"></a><span class="lineno">  847</span>                  <span class="stringliteral">&quot;indicates whether preemptively or concurrently).&quot;</span>);</div>
<div class="line"><a id="l00848" name="l00848"></a><span class="lineno">  848</span>    *err_code = <a class="code hl_enumvalue" href="namespaceipc_1_1transport_1_1error.html#adfef15ef4e76cc55d652fbd9c2797297a291f8a813c292ccdb475c345181653ac">error::Code::S_INTERRUPTED</a>;</div>
<div class="line"><a id="l00849" name="l00849"></a><span class="lineno">  849</span>  }</div>
<div class="line"><a id="l00850" name="l00850"></a><span class="lineno">  850</span> </div>
<div class="line"><a id="l00851" name="l00851"></a><span class="lineno">  851</span>  <span class="keywordflow">if</span> (*err_code) <span class="comment">// It logged if truthy.</span></div>
<div class="line"><a id="l00852" name="l00852"></a><span class="lineno">  852</span>  {</div>
<div class="line"><a id="l00853" name="l00853"></a><span class="lineno">  853</span>    <span class="keywordflow">return</span> <span class="keyword">false</span>; <span class="comment">// not_starved is garbage.</span></div>
<div class="line"><a id="l00854" name="l00854"></a><span class="lineno">  854</span>  }</div>
<div class="line"><a id="l00855" name="l00855"></a><span class="lineno">  855</span>  <span class="comment">// else: as promised, INFOx1 log.</span></div>
<div class="line"><a id="l00856" name="l00856"></a><span class="lineno">  856</span> </div>
<div class="line"><a id="l00857" name="l00857"></a><span class="lineno">  857</span>  <span class="keywordflow">if</span> <span class="keyword">constexpr</span>(WAIT_TYPE == <a class="code hl_enumvalue" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a7cf68a89774c790d07239fdc9a8c276baabe6e70a3755b7e53cb97edeb91217f8">Wait_type::S_POLL</a>)</div>
<div class="line"><a id="l00858" name="l00858"></a><span class="lineno">  858</span>  {</div>
<div class="line"><a id="l00859" name="l00859"></a><span class="lineno">  859</span>    FLOW_LOG_TRACE(<span class="stringliteral">&quot;Bipc_mq_handle [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Poll-unstarved for snd_else_rcv [&quot;</span> &lt;&lt; SND_ELSE_RCV &lt;&lt; <span class="stringliteral">&quot;]: &quot;</span></div>
<div class="line"><a id="l00860" name="l00860"></a><span class="lineno">  860</span>                   <span class="stringliteral">&quot;succeeded? = [&quot;</span> &lt;&lt; not_starved &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00861" name="l00861"></a><span class="lineno">  861</span>  }</div>
<div class="line"><a id="l00862" name="l00862"></a><span class="lineno">  862</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> <span class="keyword">constexpr</span>(WAIT_TYPE == <a class="code hl_enumvalue" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a7cf68a89774c790d07239fdc9a8c276ba79150ec67147b158048b519ce844aedb">Wait_type::S_TIMED_WAIT</a>)</div>
<div class="line"><a id="l00863" name="l00863"></a><span class="lineno">  863</span>  {</div>
<div class="line"><a id="l00864" name="l00864"></a><span class="lineno">  864</span>    FLOW_LOG_TRACE(<span class="stringliteral">&quot;Bipc_mq_handle [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Blocking-timed-await-unstarved for &quot;</span></div>
<div class="line"><a id="l00865" name="l00865"></a><span class="lineno">  865</span>                   <span class="stringliteral">&quot;snd_else_rcv [&quot;</span> &lt;&lt; SND_ELSE_RCV &lt;&lt; <span class="stringliteral">&quot;]; timeout ~[&quot;</span> &lt;&lt; round&lt;microseconds&gt;(timeout_from_now) &lt;&lt; <span class="stringliteral">&quot;]: &quot;</span></div>
<div class="line"><a id="l00866" name="l00866"></a><span class="lineno">  866</span>                   <span class="stringliteral">&quot;succeeded? = [&quot;</span> &lt;&lt; not_starved &lt;&lt; <span class="stringliteral">&quot;].  &quot;</span></div>
<div class="line"><a id="l00867" name="l00867"></a><span class="lineno">  867</span>                   <span class="stringliteral">&quot;Either was immediately unstarved, or was not but waited until success or timeout+failure.  &quot;</span></div>
<div class="line"><a id="l00868" name="l00868"></a><span class="lineno">  868</span>                   <span class="stringliteral">&quot;If success: TRACE message (if visible) above indicates which occurred.&quot;</span>);</div>
<div class="line"><a id="l00869" name="l00869"></a><span class="lineno">  869</span>  }</div>
<div class="line"><a id="l00870" name="l00870"></a><span class="lineno">  870</span>  <span class="keywordflow">else</span></div>
<div class="line"><a id="l00871" name="l00871"></a><span class="lineno">  871</span>  {</div>
<div class="line"><a id="l00872" name="l00872"></a><span class="lineno">  872</span>    assert(not_starved);</div>
<div class="line"><a id="l00873" name="l00873"></a><span class="lineno">  873</span>    FLOW_LOG_TRACE(<span class="stringliteral">&quot;Bipc_mq_handle [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Blocking-await-unstarved for &quot;</span></div>
<div class="line"><a id="l00874" name="l00874"></a><span class="lineno">  874</span>                   <span class="stringliteral">&quot;snd_else_rcv [&quot;</span> &lt;&lt; SND_ELSE_RCV &lt;&lt; <span class="stringliteral">&quot;]: succeeded eventually.  &quot;</span></div>
<div class="line"><a id="l00875" name="l00875"></a><span class="lineno">  875</span>                   <span class="stringliteral">&quot;Either was immediately unstarved, or was not but waited it out.  &quot;</span></div>
<div class="line"><a id="l00876" name="l00876"></a><span class="lineno">  876</span>                   <span class="stringliteral">&quot;TRACE message (if visible) above indicates which occurred.&quot;</span>);</div>
<div class="line"><a id="l00877" name="l00877"></a><span class="lineno">  877</span>  }</div>
<div class="line"><a id="l00878" name="l00878"></a><span class="lineno">  878</span> </div>
<div class="line"><a id="l00879" name="l00879"></a><span class="lineno">  879</span>  <span class="keywordflow">return</span> not_starved; <span class="comment">// Logged about it already.</span></div>
<div class="line"><a id="l00880" name="l00880"></a><span class="lineno">  880</span>} <span class="comment">// Bipc_mq_handle::wait_impl()</span></div>
<div class="line"><a id="l00881" name="l00881"></a><span class="lineno">  881</span> </div>
<div class="line"><a id="l00882" name="l00882"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Bipc__mq__handle.html#afa693699d1678040f6d22efbfaf657fe">  882</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#afa693699d1678040f6d22efbfaf657fe">Bipc_mq_handle::is_sendable</a>(<a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code)</div>
<div class="line"><a id="l00883" name="l00883"></a><span class="lineno">  883</span>{</div>
<div class="line"><a id="l00884" name="l00884"></a><span class="lineno">  884</span>  <span class="keywordflow">return</span> wait_impl&lt;Wait_type::S_POLL, true&gt;(<a class="code hl_typedef" href="namespaceipc_1_1util.html#ac66141280c3b7295a86b65209f31cc58">util::Fine_duration</a>(), err_code);</div>
<div class="line"><a id="l00885" name="l00885"></a><span class="lineno">  885</span>}</div>
<div class="line"><a id="l00886" name="l00886"></a><span class="lineno">  886</span> </div>
<div class="line"><a id="l00887" name="l00887"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Bipc__mq__handle.html#ad81eec3af613f32444785f8b5426ec50">  887</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#ad81eec3af613f32444785f8b5426ec50">Bipc_mq_handle::wait_sendable</a>(<a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code)</div>
<div class="line"><a id="l00888" name="l00888"></a><span class="lineno">  888</span>{</div>
<div class="line"><a id="l00889" name="l00889"></a><span class="lineno">  889</span>  wait_impl&lt;Wait_type::S_WAIT, true&gt;(<a class="code hl_typedef" href="namespaceipc_1_1util.html#ac66141280c3b7295a86b65209f31cc58">util::Fine_duration</a>(), err_code);</div>
<div class="line"><a id="l00890" name="l00890"></a><span class="lineno">  890</span>}</div>
<div class="line"><a id="l00891" name="l00891"></a><span class="lineno">  891</span> </div>
<div class="line"><a id="l00892" name="l00892"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a164168adee0d188da11db8f17442dbef">  892</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a164168adee0d188da11db8f17442dbef">Bipc_mq_handle::timed_wait_sendable</a>(<a class="code hl_typedef" href="namespaceipc_1_1util.html#ac66141280c3b7295a86b65209f31cc58">util::Fine_duration</a> timeout_from_now, <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code)</div>
<div class="line"><a id="l00893" name="l00893"></a><span class="lineno">  893</span>{</div>
<div class="line"><a id="l00894" name="l00894"></a><span class="lineno">  894</span>  <span class="keywordflow">return</span> wait_impl&lt;Wait_type::S_TIMED_WAIT, true&gt;(timeout_from_now, err_code);</div>
<div class="line"><a id="l00895" name="l00895"></a><span class="lineno">  895</span>}</div>
<div class="line"><a id="l00896" name="l00896"></a><span class="lineno">  896</span> </div>
<div class="line"><a id="l00897" name="l00897"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Bipc__mq__handle.html#adade0e6deab4db302be7343d27568e8a">  897</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#adade0e6deab4db302be7343d27568e8a">Bipc_mq_handle::is_receivable</a>(<a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code)</div>
<div class="line"><a id="l00898" name="l00898"></a><span class="lineno">  898</span>{</div>
<div class="line"><a id="l00899" name="l00899"></a><span class="lineno">  899</span>  <span class="keywordflow">return</span> wait_impl&lt;Wait_type::S_POLL, false&gt;(<a class="code hl_typedef" href="namespaceipc_1_1util.html#ac66141280c3b7295a86b65209f31cc58">util::Fine_duration</a>(), err_code);</div>
<div class="line"><a id="l00900" name="l00900"></a><span class="lineno">  900</span>}</div>
<div class="line"><a id="l00901" name="l00901"></a><span class="lineno">  901</span> </div>
<div class="line"><a id="l00902" name="l00902"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a7e2d79b92673be3ddba30c6d57020125">  902</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a7e2d79b92673be3ddba30c6d57020125">Bipc_mq_handle::wait_receivable</a>(<a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code)</div>
<div class="line"><a id="l00903" name="l00903"></a><span class="lineno">  903</span>{</div>
<div class="line"><a id="l00904" name="l00904"></a><span class="lineno">  904</span>  wait_impl&lt;Wait_type::S_WAIT, false&gt;(<a class="code hl_typedef" href="namespaceipc_1_1util.html#ac66141280c3b7295a86b65209f31cc58">util::Fine_duration</a>(), err_code);</div>
<div class="line"><a id="l00905" name="l00905"></a><span class="lineno">  905</span>}</div>
<div class="line"><a id="l00906" name="l00906"></a><span class="lineno">  906</span> </div>
<div class="line"><a id="l00907" name="l00907"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a5d2035b92c80a1b2e27b9e238107f1b1">  907</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a5d2035b92c80a1b2e27b9e238107f1b1">Bipc_mq_handle::timed_wait_receivable</a>(<a class="code hl_typedef" href="namespaceipc_1_1util.html#ac66141280c3b7295a86b65209f31cc58">util::Fine_duration</a> timeout_from_now, <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code)</div>
<div class="line"><a id="l00908" name="l00908"></a><span class="lineno">  908</span>{</div>
<div class="line"><a id="l00909" name="l00909"></a><span class="lineno">  909</span>  <span class="keywordflow">return</span> wait_impl&lt;Wait_type::S_TIMED_WAIT, false&gt;(timeout_from_now, err_code);</div>
<div class="line"><a id="l00910" name="l00910"></a><span class="lineno">  910</span>}</div>
<div class="line"><a id="l00911" name="l00911"></a><span class="lineno">  911</span> </div>
<div class="line"><a id="l00912" name="l00912"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a982a83871b89211f073dfafa49bb4c27">  912</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a982a83871b89211f073dfafa49bb4c27">Bipc_mq_handle::remove_persistent</a>(flow::log::Logger* logger_ptr, <span class="comment">// Static.</span></div>
<div class="line"><a id="l00913" name="l00913"></a><span class="lineno">  913</span>                                       <span class="keyword">const</span> <a class="code hl_class" href="classipc_1_1util_1_1Shared__name.html">Shared_name</a>&amp; absolute_name, <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code)</div>
<div class="line"><a id="l00914" name="l00914"></a><span class="lineno">  914</span>{</div>
<div class="line"><a id="l00915" name="l00915"></a><span class="lineno">  915</span>  <span class="keyword">using </span>bipc::message_queue;</div>
<div class="line"><a id="l00916" name="l00916"></a><span class="lineno">  916</span>  <span class="keyword">using </span>boost::system::system_category;</div>
<div class="line"><a id="l00917" name="l00917"></a><span class="lineno">  917</span> </div>
<div class="line"><a id="l00918" name="l00918"></a><span class="lineno">  918</span>  <span class="keywordflow">if</span> (flow::error::exec_void_and_throw_on_error</div>
<div class="line"><a id="l00919" name="l00919"></a><span class="lineno">  919</span>        ([&amp;](<a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* actual_err_code)</div>
<div class="line"><a id="l00920" name="l00920"></a><span class="lineno">  920</span>           { <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a982a83871b89211f073dfafa49bb4c27">remove_persistent</a>(logger_ptr, <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a7263ed9ec4f8ed534c0f7907b7accde9">absolute_name</a>, actual_err_code); },</div>
<div class="line"><a id="l00921" name="l00921"></a><span class="lineno">  921</span>         err_code, <span class="stringliteral">&quot;Bipc_mq_handle::remove_persistent()&quot;</span>))</div>
<div class="line"><a id="l00922" name="l00922"></a><span class="lineno">  922</span>  {</div>
<div class="line"><a id="l00923" name="l00923"></a><span class="lineno">  923</span>    <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00924" name="l00924"></a><span class="lineno">  924</span>  }</div>
<div class="line"><a id="l00925" name="l00925"></a><span class="lineno">  925</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00926" name="l00926"></a><span class="lineno">  926</span> </div>
<div class="line"><a id="l00927" name="l00927"></a><span class="lineno">  927</span>  FLOW_LOG_SET_CONTEXT(logger_ptr, Log_component::S_TRANSPORT);</div>
<div class="line"><a id="l00928" name="l00928"></a><span class="lineno">  928</span> </div>
<div class="line"><a id="l00929" name="l00929"></a><span class="lineno">  929</span>  FLOW_LOG_INFO(<span class="stringliteral">&quot;Bipc_mq @ Shared_name[&quot;</span> &lt;&lt; <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a7263ed9ec4f8ed534c0f7907b7accde9">absolute_name</a> &lt;&lt; <span class="stringliteral">&quot;]: Removing persistent MQ if possible.&quot;</span>);</div>
<div class="line"><a id="l00930" name="l00930"></a><span class="lineno">  930</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> ok = message_queue::remove(<a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a7263ed9ec4f8ed534c0f7907b7accde9">absolute_name</a>.<a class="code hl_function" href="classipc_1_1util_1_1Shared__name.html#a0bccc73c9c5b4f3b784a1e57cdc5c910">native_str</a>()); <span class="comment">// Does not throw.</span></div>
<div class="line"><a id="l00931" name="l00931"></a><span class="lineno">  931</span> </div>
<div class="line"><a id="l00932" name="l00932"></a><span class="lineno">  932</span>  <span class="keywordflow">if</span> (ok)</div>
<div class="line"><a id="l00933" name="l00933"></a><span class="lineno">  933</span>  {</div>
<div class="line"><a id="l00934" name="l00934"></a><span class="lineno">  934</span>    err_code-&gt;clear();</div>
<div class="line"><a id="l00935" name="l00935"></a><span class="lineno">  935</span>    <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00936" name="l00936"></a><span class="lineno">  936</span>  }</div>
<div class="line"><a id="l00937" name="l00937"></a><span class="lineno">  937</span>  <span class="comment">/* message_queue::remove() is strangely gimped -- though I believe so are the other kernel-persistent remove()s</span></div>
<div class="line"><a id="l00938" name="l00938"></a><span class="lineno">  938</span><span class="comment">   * throughout bipc -- it does not throw and merely returns true or false and no code.  Odd, since there can</span></div>
<div class="line"><a id="l00939" name="l00939"></a><span class="lineno">  939</span><span class="comment">   * be at least a couple of reasons one would fail to delete....  However, in POSIX, the Boost 1.78 source code</span></div>
<div class="line"><a id="l00940" name="l00940"></a><span class="lineno">  940</span><span class="comment">   * shows that mq::remove() calls shared_memory_object::remove() which calls some internal</span></div>
<div class="line"><a id="l00941" name="l00941"></a><span class="lineno">  941</span><span class="comment">   * ipcdetail::delete_file() which calls... drumroll... freakin&#39; ::unlink(const char*).  Hence we haxor: */</span></div>
<div class="line"><a id="l00942" name="l00942"></a><span class="lineno">  942</span><span class="preprocessor">#ifndef FLOW_OS_LINUX </span><span class="comment">// @todo Should maybe check Boost version or something too?</span></div>
<div class="line"><a id="l00943" name="l00943"></a><span class="lineno">  943</span>  <span class="keyword">static_assert</span>(<span class="keyword">false</span>,</div>
<div class="line"><a id="l00944" name="l00944"></a><span class="lineno">  944</span>                <span class="stringliteral">&quot;Code in Bipc_mq_handle::remove_persistent() relies on Boost invoking Linux unlink() with errno.&quot;</span>);</div>
<div class="line"><a id="l00945" name="l00945"></a><span class="lineno">  945</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00946" name="l00946"></a><span class="lineno">  946</span>  <span class="keyword">const</span> <span class="keyword">auto</span>&amp; sys_err_code = *err_code = <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>(errno, system_category());</div>
<div class="line"><a id="l00947" name="l00947"></a><span class="lineno">  947</span>  FLOW_ERROR_SYS_ERROR_LOG_WARNING();</div>
<div class="line"><a id="l00948" name="l00948"></a><span class="lineno">  948</span>} <span class="comment">// Bipc_mq_handle::remove_persistent()</span></div>
<div class="line"><a id="l00949" name="l00949"></a><span class="lineno">  949</span> </div>
<div class="line"><a id="l00950" name="l00950"></a><span class="lineno">  950</span><span class="keyword">template</span>&lt;<span class="keyword">typename</span> Func&gt;</div>
<div class="line"><a id="l00951" name="l00951"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a9948742d87298d5842d298de9c946c7c">  951</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a9948742d87298d5842d298de9c946c7c">Bipc_mq_handle::op_with_possible_bipc_mq_exception</a>(<a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code, <a class="code hl_typedef" href="namespaceipc_1_1util.html#ae6ac47812a90d1287c61e0b7de7bc4f5">util::String_view</a> context,</div>
<div class="line"><a id="l00952" name="l00952"></a><span class="lineno">  952</span>                                                        <span class="keyword">const</span> Func&amp; func)</div>
<div class="line"><a id="l00953" name="l00953"></a><span class="lineno">  953</span>{</div>
<div class="line"><a id="l00954" name="l00954"></a><span class="lineno">  954</span>  <span class="keyword">using </span>flow::error::Runtime_error;</div>
<div class="line"><a id="l00955" name="l00955"></a><span class="lineno">  955</span>  <span class="keyword">using </span>bipc::interprocess_exception;</div>
<div class="line"><a id="l00956" name="l00956"></a><span class="lineno">  956</span>  <span class="keyword">using </span>boost::system::system_category;</div>
<div class="line"><a id="l00957" name="l00957"></a><span class="lineno">  957</span> </div>
<div class="line"><a id="l00958" name="l00958"></a><span class="lineno">  958</span>  <span class="keywordflow">if</span> (flow::error::exec_void_and_throw_on_error</div>
<div class="line"><a id="l00959" name="l00959"></a><span class="lineno">  959</span>        ([&amp;](<a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* actual_err_code) { <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a9948742d87298d5842d298de9c946c7c">op_with_possible_bipc_mq_exception</a>(actual_err_code, context, func); },</div>
<div class="line"><a id="l00960" name="l00960"></a><span class="lineno">  960</span>         err_code, context))</div>
<div class="line"><a id="l00961" name="l00961"></a><span class="lineno">  961</span>  {</div>
<div class="line"><a id="l00962" name="l00962"></a><span class="lineno">  962</span>    <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00963" name="l00963"></a><span class="lineno">  963</span>  }</div>
<div class="line"><a id="l00964" name="l00964"></a><span class="lineno">  964</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00965" name="l00965"></a><span class="lineno">  965</span> </div>
<div class="line"><a id="l00966" name="l00966"></a><span class="lineno">  966</span>  <span class="keywordflow">try</span></div>
<div class="line"><a id="l00967" name="l00967"></a><span class="lineno">  967</span>  {</div>
<div class="line"><a id="l00968" name="l00968"></a><span class="lineno">  968</span>    func();</div>
<div class="line"><a id="l00969" name="l00969"></a><span class="lineno">  969</span>  }</div>
<div class="line"><a id="l00970" name="l00970"></a><span class="lineno">  970</span>  <span class="keywordflow">catch</span> (<span class="keyword">const</span> interprocess_exception&amp; exc)</div>
<div class="line"><a id="l00971" name="l00971"></a><span class="lineno">  971</span>  {</div>
<div class="line"><a id="l00972" name="l00972"></a><span class="lineno">  972</span>    <span class="comment">/* They appear to always throw this guy with some interesting semantics.  We want to yield our consistent</span></div>
<div class="line"><a id="l00973" name="l00973"></a><span class="lineno">  973</span><span class="comment">     * Flow-style semantics, namely produce a truthy *err_code (which, if actual original err_code was null will</span></div>
<div class="line"><a id="l00974" name="l00974"></a><span class="lineno">  974</span><span class="comment">     * be instead thrown after being wrapped in a flow::Runtime_error, which is really a boost::system::system_error</span></div>
<div class="line"><a id="l00975" name="l00975"></a><span class="lineno">  975</span><span class="comment">     * with a cleaner what() message).  More details inline below.</span></div>
<div class="line"><a id="l00976" name="l00976"></a><span class="lineno">  976</span><span class="comment">     *</span></div>
<div class="line"><a id="l00977" name="l00977"></a><span class="lineno">  977</span><span class="comment">     * So interprocess_exception is not a system_error even but rather an exception with a particular custom API.</span></div>
<div class="line"><a id="l00978" name="l00978"></a><span class="lineno">  978</span><span class="comment">     * To ensure the information is logged *somewhere* for sure and not lost do log all of this.</span></div>
<div class="line"><a id="l00979" name="l00979"></a><span class="lineno">  979</span><span class="comment">     * After that normalize to the *err_code semantics, even if some information is lost -- though we&#39;ll try</span></div>
<div class="line"><a id="l00980" name="l00980"></a><span class="lineno">  980</span><span class="comment">     * to lose nothing even so. */</span></div>
<div class="line"><a id="l00981" name="l00981"></a><span class="lineno">  981</span>    <span class="keyword">const</span> <span class="keyword">auto</span> native_code_raw = exc.get_native_error();</div>
<div class="line"><a id="l00982" name="l00982"></a><span class="lineno">  982</span>    <span class="keyword">const</span> <span class="keyword">auto</span> bipc_err_code_enum = exc.get_error_code();</div>
<div class="line"><a id="l00983" name="l00983"></a><span class="lineno">  983</span>    <span class="keyword">const</span> <span class="keywordtype">bool</span> is_size_error = bipc_err_code_enum == bipc::size_error;</div>
<div class="line"><a id="l00984" name="l00984"></a><span class="lineno">  984</span>    FLOW_LOG_WARNING(<span class="stringliteral">&quot;bipc threw interprocess_exception; will emit some hopefully suitable Flow-IPC Error_code; &quot;</span></div>
<div class="line"><a id="l00985" name="l00985"></a><span class="lineno">  985</span>                     <span class="stringliteral">&quot;but here are all the details of the original exception: native code int &quot;</span></div>
<div class="line"><a id="l00986" name="l00986"></a><span class="lineno">  986</span>                     <span class="stringliteral">&quot;[&quot;</span> &lt;&lt; native_code_raw &lt;&lt; <span class="stringliteral">&quot;]; bipc error_code_t enum-&gt;int &quot;</span></div>
<div class="line"><a id="l00987" name="l00987"></a><span class="lineno">  987</span>                     <span class="stringliteral">&quot;[&quot;</span> &lt;&lt; <span class="keywordtype">int</span>(bipc_err_code_enum) &lt;&lt; <span class="stringliteral">&quot;]; latter==size_error? = [&quot;</span> &lt;&lt; is_size_error &lt;&lt; <span class="stringliteral">&quot;]; &quot;</span></div>
<div class="line"><a id="l00988" name="l00988"></a><span class="lineno">  988</span>                     <span class="stringliteral">&quot;message = [&quot;</span> &lt;&lt; exc.what() &lt;&lt; <span class="stringliteral">&quot;]; context = [&quot;</span> &lt;&lt; context &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00989" name="l00989"></a><span class="lineno">  989</span> </div>
<div class="line"><a id="l00990" name="l00990"></a><span class="lineno">  990</span>    <span class="comment">/* Special case: size_error is thrown by message_queue on a receive with underflow or send with overflow.</span></div>
<div class="line"><a id="l00991" name="l00991"></a><span class="lineno">  991</span><span class="comment">     * Our API contract (Persistent_mq_handle concept doc header) is to emit this particular code then. */</span></div>
<div class="line"><a id="l00992" name="l00992"></a><span class="lineno">  992</span>    <span class="keywordflow">if</span> (is_size_error)</div>
<div class="line"><a id="l00993" name="l00993"></a><span class="lineno">  993</span>    {</div>
<div class="line"><a id="l00994" name="l00994"></a><span class="lineno">  994</span>      <span class="comment">// Sufficient.  (Check of Boost 1.78 source code confirms there&#39;s no native code in this case anyway.)</span></div>
<div class="line"><a id="l00995" name="l00995"></a><span class="lineno">  995</span>      *err_code = <a class="code hl_enumvalue" href="namespaceipc_1_1transport_1_1error.html#adfef15ef4e76cc55d652fbd9c2797297a9ee20939f859e44681c24f6d153cc36b">error::Code::S_MQ_MESSAGE_SIZE_OVER_OR_UNDERFLOW</a>;</div>
<div class="line"><a id="l00996" name="l00996"></a><span class="lineno">  996</span>      <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00997" name="l00997"></a><span class="lineno">  997</span>    }</div>
<div class="line"><a id="l00998" name="l00998"></a><span class="lineno">  998</span>    <span class="comment">// else</span></div>
<div class="line"><a id="l00999" name="l00999"></a><span class="lineno">  999</span>    <span class="keywordflow">if</span> (native_code_raw != 0)</div>
<div class="line"><a id="l01000" name="l01000"></a><span class="lineno"> 1000</span>    {</div>
<div class="line"><a id="l01001" name="l01001"></a><span class="lineno"> 1001</span>      <span class="comment">/* At least in POSIX, interprocess_exception only does the following in this case:</span></div>
<div class="line"><a id="l01002" name="l01002"></a><span class="lineno"> 1002</span><span class="comment">       *   - strerror(native_code_raw) =&gt; the message.  But that&#39;s standard boost.system errno handling already;</span></div>
<div class="line"><a id="l01003" name="l01003"></a><span class="lineno"> 1003</span><span class="comment">       *     so if just emit a system_category() Error_code, all will be equally well message-wise in what().</span></div>
<div class="line"><a id="l01004" name="l01004"></a><span class="lineno"> 1004</span><span class="comment">       *   - They have a table that maps certain native_code_raw values to one of a few (not super-many but not</span></div>
<div class="line"><a id="l01005" name="l01005"></a><span class="lineno"> 1005</span><span class="comment">       *     a handful) bipc_err_code_enum enum values.  Technically the following will lose that information;</span></div>
<div class="line"><a id="l01006" name="l01006"></a><span class="lineno"> 1006</span><span class="comment">       *     but (1) it is logged above; and (2) so what? */</span></div>
<div class="line"><a id="l01007" name="l01007"></a><span class="lineno"> 1007</span>      <span class="keyword">const</span> <span class="keyword">auto</span>&amp; sys_err_code = *err_code = <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>(native_code_raw, system_category());</div>
<div class="line"><a id="l01008" name="l01008"></a><span class="lineno"> 1008</span>      FLOW_ERROR_SYS_ERROR_LOG_WARNING();</div>
<div class="line"><a id="l01009" name="l01009"></a><span class="lineno"> 1009</span>      <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01010" name="l01010"></a><span class="lineno"> 1010</span>    }</div>
<div class="line"><a id="l01011" name="l01011"></a><span class="lineno"> 1011</span>    <span class="comment">// else</span></div>
<div class="line"><a id="l01012" name="l01012"></a><span class="lineno"> 1012</span> </div>
<div class="line"><a id="l01013" name="l01013"></a><span class="lineno"> 1013</span>    <span class="comment">/* All we have is bipc_err_code_enum.  We&#39;ve already handled the known likely issue, size_error.  Beyond that</span></div>
<div class="line"><a id="l01014" name="l01014"></a><span class="lineno"> 1014</span><span class="comment">     * there does not seem to be much we can do; really it&#39;s a matter of either emitting one catch-all code or</span></div>
<div class="line"><a id="l01015" name="l01015"></a><span class="lineno"> 1015</span><span class="comment">     * having our own equivalents of their enum.  For now, at least, the former is OK.  @todo Revisit. */</span></div>
<div class="line"><a id="l01016" name="l01016"></a><span class="lineno"> 1016</span>    *err_code = <a class="code hl_enumvalue" href="namespaceipc_1_1transport_1_1error.html#adfef15ef4e76cc55d652fbd9c2797297a515698d19c829006a0803477fb605ae3">error::Code::S_MQ_BIPC_MISC_LIBRARY_ERROR</a>; <span class="comment">// The earlier WARNING is good enough.</span></div>
<div class="line"><a id="l01017" name="l01017"></a><span class="lineno"> 1017</span>    <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01018" name="l01018"></a><span class="lineno"> 1018</span>  } <span class="comment">// catch ()</span></div>
<div class="line"><a id="l01019" name="l01019"></a><span class="lineno"> 1019</span>  <span class="comment">// Got here: all good.</span></div>
<div class="line"><a id="l01020" name="l01020"></a><span class="lineno"> 1020</span>  err_code-&gt;clear();</div>
<div class="line"><a id="l01021" name="l01021"></a><span class="lineno"> 1021</span>} <span class="comment">// Bipc_mq_handle::op_with_possible_bipc_mq_exception()</span></div>
<div class="line"><a id="l01022" name="l01022"></a><span class="lineno"> 1022</span> </div>
<div class="line"><a id="l01023" name="l01023"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a7263ed9ec4f8ed534c0f7907b7accde9"> 1023</a></span><span class="keyword">const</span> <a class="code hl_class" href="classipc_1_1util_1_1Shared__name.html">Shared_name</a>&amp; <a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a7263ed9ec4f8ed534c0f7907b7accde9">Bipc_mq_handle::absolute_name</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l01024" name="l01024"></a><span class="lineno"> 1024</span><span class="keyword"></span>{</div>
<div class="line"><a id="l01025" name="l01025"></a><span class="lineno"> 1025</span>  <span class="keywordflow">return</span> <a class="code hl_variable" href="classipc_1_1transport_1_1Bipc__mq__handle.html#ade4351eeddc732c817af9a924780ba27">m_absolute_name</a>;</div>
<div class="line"><a id="l01026" name="l01026"></a><span class="lineno"> 1026</span>}</div>
<div class="line"><a id="l01027" name="l01027"></a><span class="lineno"> 1027</span> </div>
<div class="line"><a id="l01028" name="l01028"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a61c80019823537694f925275dccb4f3f"> 1028</a></span>std::ostream&amp; <a class="code hl_function" href="namespaceipc_1_1transport.html#a61c80019823537694f925275dccb4f3f">operator&lt;&lt;</a>(std::ostream&amp; os, <span class="keyword">const</span> <a class="code hl_class" href="classipc_1_1transport_1_1Bipc__mq__handle.html">Bipc_mq_handle</a>&amp; val)</div>
<div class="line"><a id="l01029" name="l01029"></a><span class="lineno"> 1029</span>{</div>
<div class="line"><a id="l01030" name="l01030"></a><span class="lineno"> 1030</span>  <span class="keywordflow">return</span> os &lt;&lt; <span class="charliteral">&#39;@&#39;</span> &lt;&lt; &amp;val &lt;&lt; <span class="stringliteral">&quot;: sh_name[&quot;</span> &lt;&lt; val.<a class="code hl_function" href="classipc_1_1transport_1_1Bipc__mq__handle.html#a7263ed9ec4f8ed534c0f7907b7accde9">absolute_name</a>() &lt;&lt; <span class="charliteral">&#39;]&#39;</span>;</div>
<div class="line"><a id="l01031" name="l01031"></a><span class="lineno"> 1031</span>}</div>
<div class="line"><a id="l01032" name="l01032"></a><span class="lineno"> 1032</span> </div>
<div class="line"><a id="l01033" name="l01033"></a><span class="lineno"> 1033</span>} <span class="comment">// namespace ipc::transport</span></div>
<div class="ttc" id="abipc__mq__handle_8hpp_html"><div class="ttname"><a href="bipc__mq__handle_8hpp.html">bipc_mq_handle.hpp</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Bipc__mq__handle_html"><div class="ttname"><a href="classipc_1_1transport_1_1Bipc__mq__handle.html">ipc::transport::Bipc_mq_handle</a></div><div class="ttdoc">Implements the Persistent_mq_handle concept by thinly wrapping bipc::message_queue,...</div><div class="ttdef"><b>Definition:</b> <a href="bipc__mq__handle_8hpp_source.html#l00050">bipc_mq_handle.hpp:52</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Bipc__mq__handle_html_a0022f89e50cc522971cac3eb12025924"><div class="ttname"><a href="classipc_1_1transport_1_1Bipc__mq__handle.html#a0022f89e50cc522971cac3eb12025924">ipc::transport::Bipc_mq_handle::Bipc_mq_handle</a></div><div class="ttdeci">Bipc_mq_handle()</div><div class="ttdoc">Implements Persistent_mq_handle API: Construct null handle.</div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Bipc__mq__handle_html_a02e3582a466ed25128d35d3c767259cf"><div class="ttname"><a href="classipc_1_1transport_1_1Bipc__mq__handle.html#a02e3582a466ed25128d35d3c767259cf">ipc::transport::Bipc_mq_handle::allow_receives</a></div><div class="ttdeci">bool allow_receives()</div><div class="ttdoc">Implements Persistent_mq_handle API: Turn off preemptive/concurrent interruption of blocking-receives...</div><div class="ttdef"><b>Definition:</b> <a href="bipc__mq__handle_8cpp_source.html#l00621">bipc_mq_handle.cpp:621</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Bipc__mq__handle_html_a152b99bc327c774553e9b90a5f0bc4d3"><div class="ttname"><a href="classipc_1_1transport_1_1Bipc__mq__handle.html#a152b99bc327c774553e9b90a5f0bc4d3">ipc::transport::Bipc_mq_handle::m_mq</a></div><div class="ttdeci">boost::movelib::unique_ptr&lt; bipc::message_queue &gt; m_mq</div><div class="ttdoc">Underlying MQ handle.</div><div class="ttdef"><b>Definition:</b> <a href="bipc__mq__handle_8hpp_source.html#l00589">bipc_mq_handle.hpp:589</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Bipc__mq__handle_html_a164168adee0d188da11db8f17442dbef"><div class="ttname"><a href="classipc_1_1transport_1_1Bipc__mq__handle.html#a164168adee0d188da11db8f17442dbef">ipc::transport::Bipc_mq_handle::timed_wait_sendable</a></div><div class="ttdeci">bool timed_wait_sendable(util::Fine_duration timeout_from_now, Error_code *err_code=0)</div><div class="ttdoc">Implements Persistent_mq_handle API: Like timed_send() but without the actual pushing of a message.</div><div class="ttdef"><b>Definition:</b> <a href="bipc__mq__handle_8cpp_source.html#l00892">bipc_mq_handle.cpp:892</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Bipc__mq__handle_html_a1a94d32b8a1bc93d19b19a0da35cd062"><div class="ttname"><a href="classipc_1_1transport_1_1Bipc__mq__handle.html#a1a94d32b8a1bc93d19b19a0da35cd062">ipc::transport::Bipc_mq_handle::operator=</a></div><div class="ttdeci">Bipc_mq_handle &amp; operator=(Bipc_mq_handle &amp;&amp;src)</div><div class="ttdoc">Implements Persistent_mq_handle API: Replaces handle with the source handle while making the latter i...</div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Bipc__mq__handle_html_a3eb1daea17bbfa332e6f50e4f6625bab"><div class="ttname"><a href="classipc_1_1transport_1_1Bipc__mq__handle.html#a3eb1daea17bbfa332e6f50e4f6625bab">ipc::transport::Bipc_mq_handle::m_interrupting_rcv</a></div><div class="ttdeci">bool m_interrupting_rcv</div><div class="ttdoc">Other-direction counterpart to m_interrupting_snd.</div><div class="ttdef"><b>Definition:</b> <a href="bipc__mq__handle_8hpp_source.html#l00612">bipc_mq_handle.hpp:612</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Bipc__mq__handle_html_a40a750e20cb4696cdb7dc6cdddc78b1a"><div class="ttname"><a href="classipc_1_1transport_1_1Bipc__mq__handle.html#a40a750e20cb4696cdb7dc6cdddc78b1a">ipc::transport::Bipc_mq_handle::interrupt_sends</a></div><div class="ttdeci">bool interrupt_sends()</div><div class="ttdoc">Implements Persistent_mq_handle API: Turn on preemptive/concurrent interruption of blocking-sends and...</div><div class="ttdef"><b>Definition:</b> <a href="bipc__mq__handle_8cpp_source.html#l00606">bipc_mq_handle.cpp:606</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Bipc__mq__handle_html_a45e952a67d6568f6ef4834a3523a2ca4"><div class="ttname"><a href="classipc_1_1transport_1_1Bipc__mq__handle.html#a45e952a67d6568f6ef4834a3523a2ca4">ipc::transport::Bipc_mq_handle::send</a></div><div class="ttdeci">void send(const util::Blob_const &amp;blob, Error_code *err_code=0)</div><div class="ttdoc">Implements Persistent_mq_handle API: Blocking send: pushes copy of message to queue; if queue is full...</div><div class="ttdef"><b>Definition:</b> <a href="bipc__mq__handle_8cpp_source.html#l00200">bipc_mq_handle.cpp:200</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Bipc__mq__handle_html_a4c3406cf8759017342ed295fcc833704"><div class="ttname"><a href="classipc_1_1transport_1_1Bipc__mq__handle.html#a4c3406cf8759017342ed295fcc833704">ipc::transport::Bipc_mq_handle::try_send</a></div><div class="ttdeci">bool try_send(const util::Blob_const &amp;blob, Error_code *err_code=0)</div><div class="ttdoc">Implements Persistent_mq_handle API: Non-blocking send: pushes copy of message to queue and returns t...</div><div class="ttdef"><b>Definition:</b> <a href="bipc__mq__handle_8cpp_source.html#l00154">bipc_mq_handle.cpp:154</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Bipc__mq__handle_html_a5d2035b92c80a1b2e27b9e238107f1b1"><div class="ttname"><a href="classipc_1_1transport_1_1Bipc__mq__handle.html#a5d2035b92c80a1b2e27b9e238107f1b1">ipc::transport::Bipc_mq_handle::timed_wait_receivable</a></div><div class="ttdeci">bool timed_wait_receivable(util::Fine_duration timeout_from_now, Error_code *err_code=0)</div><div class="ttdoc">Implements Persistent_mq_handle API: Like timed_receive() but without the actual popping of a message...</div><div class="ttdef"><b>Definition:</b> <a href="bipc__mq__handle_8cpp_source.html#l00907">bipc_mq_handle.cpp:907</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Bipc__mq__handle_html_a67be05bc1749981e0863d18681d006ac"><div class="ttname"><a href="classipc_1_1transport_1_1Bipc__mq__handle.html#a67be05bc1749981e0863d18681d006ac">ipc::transport::Bipc_mq_handle::timed_receive</a></div><div class="ttdeci">bool timed_receive(util::Blob_mutable *blob, util::Fine_duration timeout_from_now, Error_code *err_code=0)</div><div class="ttdoc">Implements Persistent_mq_handle API: Blocking timed receive: pops copy of message from queue into buf...</div><div class="ttdef"><b>Definition:</b> <a href="bipc__mq__handle_8cpp_source.html#l00457">bipc_mq_handle.cpp:457</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Bipc__mq__handle_html_a7263ed9ec4f8ed534c0f7907b7accde9"><div class="ttname"><a href="classipc_1_1transport_1_1Bipc__mq__handle.html#a7263ed9ec4f8ed534c0f7907b7accde9">ipc::transport::Bipc_mq_handle::absolute_name</a></div><div class="ttdeci">const Shared_name &amp; absolute_name() const</div><div class="ttdoc">Implements Persistent_mq_handle API: Returns name equal to absolute_name passed to ctor.</div><div class="ttdef"><b>Definition:</b> <a href="bipc__mq__handle_8cpp_source.html#l01023">bipc_mq_handle.cpp:1023</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Bipc__mq__handle_html_a76ef929399fb9a7b4cec9ebb4d2ad6f0"><div class="ttname"><a href="classipc_1_1transport_1_1Bipc__mq__handle.html#a76ef929399fb9a7b4cec9ebb4d2ad6f0">ipc::transport::Bipc_mq_handle::S_RESOURCE_TYPE_ID</a></div><div class="ttdeci">static const Shared_name S_RESOURCE_TYPE_ID</div><div class="ttdoc">Implements concept API.</div><div class="ttdef"><b>Definition:</b> <a href="bipc__mq__handle_8hpp_source.html#l00057">bipc_mq_handle.hpp:57</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Bipc__mq__handle_html_a7993a816c819b51af70d5ab775d41f8f"><div class="ttname"><a href="classipc_1_1transport_1_1Bipc__mq__handle.html#a7993a816c819b51af70d5ab775d41f8f">ipc::transport::Bipc_mq_handle::allow_sends</a></div><div class="ttdeci">bool allow_sends()</div><div class="ttdoc">Implements Persistent_mq_handle API: Turn off preemptive/concurrent interruption of blocking-sends an...</div><div class="ttdef"><b>Definition:</b> <a href="bipc__mq__handle_8cpp_source.html#l00611">bipc_mq_handle.cpp:611</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Bipc__mq__handle_html_a7a974f3cfbb095f0b67e773f4f2fb1a9"><div class="ttname"><a href="classipc_1_1transport_1_1Bipc__mq__handle.html#a7a974f3cfbb095f0b67e773f4f2fb1a9">ipc::transport::Bipc_mq_handle::try_receive</a></div><div class="ttdeci">bool try_receive(util::Blob_mutable *blob, Error_code *err_code=0)</div><div class="ttdoc">Implements Persistent_mq_handle API: Non-blocking receive: pops copy of message from queue into buffe...</div><div class="ttdef"><b>Definition:</b> <a href="bipc__mq__handle_8cpp_source.html#l00342">bipc_mq_handle.cpp:342</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Bipc__mq__handle_html_a7cf68a89774c790d07239fdc9a8c276ba79150ec67147b158048b519ce844aedb"><div class="ttname"><a href="classipc_1_1transport_1_1Bipc__mq__handle.html#a7cf68a89774c790d07239fdc9a8c276ba79150ec67147b158048b519ce844aedb">ipc::transport::Bipc_mq_handle::Wait_type::S_TIMED_WAIT</a></div><div class="ttdeci">@ S_TIMED_WAIT</div><div class="ttdoc">Timed-wait-type (blocking until timeout).</div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Bipc__mq__handle_html_a7cf68a89774c790d07239fdc9a8c276ba92fdc9b0bcae1fd8fd720b47bdc63bcc"><div class="ttname"><a href="classipc_1_1transport_1_1Bipc__mq__handle.html#a7cf68a89774c790d07239fdc9a8c276ba92fdc9b0bcae1fd8fd720b47bdc63bcc">ipc::transport::Bipc_mq_handle::Wait_type::S_WAIT</a></div><div class="ttdeci">@ S_WAIT</div><div class="ttdoc">Wait-type (blocking indefinitely).</div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Bipc__mq__handle_html_a7cf68a89774c790d07239fdc9a8c276baabe6e70a3755b7e53cb97edeb91217f8"><div class="ttname"><a href="classipc_1_1transport_1_1Bipc__mq__handle.html#a7cf68a89774c790d07239fdc9a8c276baabe6e70a3755b7e53cb97edeb91217f8">ipc::transport::Bipc_mq_handle::Wait_type::S_POLL</a></div><div class="ttdeci">@ S_POLL</div><div class="ttdoc">Poll-type (non-blocking).</div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Bipc__mq__handle_html_a7e2d79b92673be3ddba30c6d57020125"><div class="ttname"><a href="classipc_1_1transport_1_1Bipc__mq__handle.html#a7e2d79b92673be3ddba30c6d57020125">ipc::transport::Bipc_mq_handle::wait_receivable</a></div><div class="ttdeci">void wait_receivable(Error_code *err_code=0)</div><div class="ttdoc">Implements Persistent_mq_handle API: Like receive() but without the actual popping of a message.</div><div class="ttdef"><b>Definition:</b> <a href="bipc__mq__handle_8cpp_source.html#l00902">bipc_mq_handle.cpp:902</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Bipc__mq__handle_html_a84db01ec0b3dadaa7368df4fad8f8529"><div class="ttname"><a href="classipc_1_1transport_1_1Bipc__mq__handle.html#a84db01ec0b3dadaa7368df4fad8f8529">ipc::transport::Bipc_mq_handle::interrupt_receives</a></div><div class="ttdeci">bool interrupt_receives()</div><div class="ttdoc">Implements Persistent_mq_handle API: Turn on preemptive/concurrent interruption of blocking-receives ...</div><div class="ttdef"><b>Definition:</b> <a href="bipc__mq__handle_8cpp_source.html#l00616">bipc_mq_handle.cpp:616</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Bipc__mq__handle_html_a85fdfd6a739453c86298e05bb3a55341"><div class="ttname"><a href="classipc_1_1transport_1_1Bipc__mq__handle.html#a85fdfd6a739453c86298e05bb3a55341">ipc::transport::Bipc_mq_handle::m_interrupting_snd</a></div><div class="ttdeci">bool m_interrupting_snd</div><div class="ttdoc">Starting at false, this is made true via interrupt_sends(), and back by allow_sends(); when true wait...</div><div class="ttdef"><b>Definition:</b> <a href="bipc__mq__handle_8hpp_source.html#l00609">bipc_mq_handle.hpp:609</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Bipc__mq__handle_html_a8e486336f1dfffa1c397b725b95b175b"><div class="ttname"><a href="classipc_1_1transport_1_1Bipc__mq__handle.html#a8e486336f1dfffa1c397b725b95b175b">ipc::transport::Bipc_mq_handle::timed_send</a></div><div class="ttdeci">bool timed_send(const util::Blob_const &amp;blob, util::Fine_duration timeout_from_now, Error_code *err_code=0)</div><div class="ttdoc">Implements Persistent_mq_handle API: Blocking timed send: pushes copy of message to queue; if queue i...</div><div class="ttdef"><b>Definition:</b> <a href="bipc__mq__handle_8cpp_source.html#l00262">bipc_mq_handle.cpp:262</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Bipc__mq__handle_html_a982a83871b89211f073dfafa49bb4c27"><div class="ttname"><a href="classipc_1_1transport_1_1Bipc__mq__handle.html#a982a83871b89211f073dfafa49bb4c27">ipc::transport::Bipc_mq_handle::remove_persistent</a></div><div class="ttdeci">static void remove_persistent(flow::log::Logger *logger_ptr, const Shared_name &amp;absolute_name, Error_code *err_code=0)</div><div class="ttdoc">Implements Persistent_mq_handle API: Removes the named persistent MQ.</div><div class="ttdef"><b>Definition:</b> <a href="bipc__mq__handle_8cpp_source.html#l00912">bipc_mq_handle.cpp:912</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Bipc__mq__handle_html_a9948742d87298d5842d298de9c946c7c"><div class="ttname"><a href="classipc_1_1transport_1_1Bipc__mq__handle.html#a9948742d87298d5842d298de9c946c7c">ipc::transport::Bipc_mq_handle::op_with_possible_bipc_mq_exception</a></div><div class="ttdeci">void op_with_possible_bipc_mq_exception(Error_code *err_code, util::String_view context, const Func &amp;func)</div><div class="ttdoc">Error helper: Run func() which will perform a bipc::message_queue API that might throw; if it does em...</div><div class="ttdef"><b>Definition:</b> <a href="bipc__mq__handle_8cpp_source.html#l00951">bipc_mq_handle.cpp:951</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Bipc__mq__handle_html_a9d1aaf82f6396f4d975a77a70433698d"><div class="ttname"><a href="classipc_1_1transport_1_1Bipc__mq__handle.html#a9d1aaf82f6396f4d975a77a70433698d">ipc::transport::Bipc_mq_handle::receive</a></div><div class="ttdeci">void receive(util::Blob_mutable *blob, Error_code *err_code=0)</div><div class="ttdoc">Implements Persistent_mq_handle API: Blocking receive: pops copy of message from queue into buffer; i...</div><div class="ttdef"><b>Definition:</b> <a href="bipc__mq__handle_8cpp_source.html#l00389">bipc_mq_handle.cpp:389</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Bipc__mq__handle_html_a9f3318676f5e687f791088484d1bbef8"><div class="ttname"><a href="classipc_1_1transport_1_1Bipc__mq__handle.html#a9f3318676f5e687f791088484d1bbef8">ipc::transport::Bipc_mq_handle::max_n_msgs</a></div><div class="ttdeci">size_t max_n_msgs() const</div><div class="ttdoc">Implements Persistent_mq_handle API: Returns the max message count of the underlying queue.</div><div class="ttdef"><b>Definition:</b> <a href="bipc__mq__handle_8cpp_source.html#l00148">bipc_mq_handle.cpp:148</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Bipc__mq__handle_html_abe6cb3e8131f26c250c4b623d3fa2afe"><div class="ttname"><a href="classipc_1_1transport_1_1Bipc__mq__handle.html#abe6cb3e8131f26c250c4b623d3fa2afe">ipc::transport::Bipc_mq_handle::~Bipc_mq_handle</a></div><div class="ttdeci">~Bipc_mq_handle()</div><div class="ttdoc">Implements Persistent_mq_handle API: Destroys this handle (or no-op if no handle was successfully con...</div><div class="ttdef"><b>Definition:</b> <a href="bipc__mq__handle_8cpp_source.html#l00122">bipc_mq_handle.cpp:122</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Bipc__mq__handle_html_ac52aa9402e0f5d50babff7b06e5eaab3"><div class="ttname"><a href="classipc_1_1transport_1_1Bipc__mq__handle.html#ac52aa9402e0f5d50babff7b06e5eaab3">ipc::transport::Bipc_mq_handle::interrupt_allow_impl</a></div><div class="ttdeci">bool interrupt_allow_impl()</div><div class="ttdoc">Impl body for interrupt_*() and allow_*().</div><div class="ttdef"><b>Definition:</b> <a href="bipc__mq__handle_8cpp_source.html#l00538">bipc_mq_handle.cpp:538</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Bipc__mq__handle_html_ad81eec3af613f32444785f8b5426ec50"><div class="ttname"><a href="classipc_1_1transport_1_1Bipc__mq__handle.html#ad81eec3af613f32444785f8b5426ec50">ipc::transport::Bipc_mq_handle::wait_sendable</a></div><div class="ttdeci">void wait_sendable(Error_code *err_code=0)</div><div class="ttdoc">Implements Persistent_mq_handle API: Like send() but without the actual pushing of a message.</div><div class="ttdef"><b>Definition:</b> <a href="bipc__mq__handle_8cpp_source.html#l00887">bipc_mq_handle.cpp:887</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Bipc__mq__handle_html_ad8ef88d8e0a59b770c9d15d008b52a4b"><div class="ttname"><a href="classipc_1_1transport_1_1Bipc__mq__handle.html#ad8ef88d8e0a59b770c9d15d008b52a4b">ipc::transport::Bipc_mq_handle::max_msg_size</a></div><div class="ttdeci">size_t max_msg_size() const</div><div class="ttdoc">Implements Persistent_mq_handle API: Returns the max message size of the underlying queue.</div><div class="ttdef"><b>Definition:</b> <a href="bipc__mq__handle_8cpp_source.html#l00142">bipc_mq_handle.cpp:142</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Bipc__mq__handle_html_ada9cf828123f98f5bb66236e5446d37d"><div class="ttname"><a href="classipc_1_1transport_1_1Bipc__mq__handle.html#ada9cf828123f98f5bb66236e5446d37d">ipc::transport::Bipc_mq_handle::wait_impl</a></div><div class="ttdeci">bool wait_impl(util::Fine_duration timeout_from_now, Error_code *err_code)</div><div class="ttdoc">Impl body for *_sendable() and *_receivable().</div><div class="ttdef"><b>Definition:</b> <a href="bipc__mq__handle_8cpp_source.html#l00627">bipc_mq_handle.cpp:627</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Bipc__mq__handle_html_adade0e6deab4db302be7343d27568e8a"><div class="ttname"><a href="classipc_1_1transport_1_1Bipc__mq__handle.html#adade0e6deab4db302be7343d27568e8a">ipc::transport::Bipc_mq_handle::is_receivable</a></div><div class="ttdeci">bool is_receivable(Error_code *err_code=0)</div><div class="ttdoc">Implements Persistent_mq_handle API: Like try_receive() but without the actual popping of a message.</div><div class="ttdef"><b>Definition:</b> <a href="bipc__mq__handle_8cpp_source.html#l00897">bipc_mq_handle.cpp:897</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Bipc__mq__handle_html_ade4351eeddc732c817af9a924780ba27"><div class="ttname"><a href="classipc_1_1transport_1_1Bipc__mq__handle.html#ade4351eeddc732c817af9a924780ba27">ipc::transport::Bipc_mq_handle::m_absolute_name</a></div><div class="ttdeci">Shared_name m_absolute_name</div><div class="ttdoc">See absolute_name().</div><div class="ttdef"><b>Definition:</b> <a href="bipc__mq__handle_8hpp_source.html#l00592">bipc_mq_handle.hpp:592</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Bipc__mq__handle_html_afa693699d1678040f6d22efbfaf657fe"><div class="ttname"><a href="classipc_1_1transport_1_1Bipc__mq__handle.html#afa693699d1678040f6d22efbfaf657fe">ipc::transport::Bipc_mq_handle::is_sendable</a></div><div class="ttdeci">bool is_sendable(Error_code *err_code=0)</div><div class="ttdoc">Implements Persistent_mq_handle API: Like try_send() but without the actual pushing of a message.</div><div class="ttdef"><b>Definition:</b> <a href="bipc__mq__handle_8cpp_source.html#l00882">bipc_mq_handle.cpp:882</a></div></div>
<div class="ttc" id="aclassipc_1_1util_1_1Shared__name_html"><div class="ttname"><a href="classipc_1_1util_1_1Shared__name.html">ipc::util::Shared_name</a></div><div class="ttdoc">String-wrapping abstraction representing a name uniquely distinguishing a kernel-persistent entity fr...</div><div class="ttdef"><b>Definition:</b> <a href="shared__name_8hpp_source.html#l00241">shared_name.hpp:242</a></div></div>
<div class="ttc" id="aclassipc_1_1util_1_1Shared__name_html_a0bccc73c9c5b4f3b784a1e57cdc5c910"><div class="ttname"><a href="classipc_1_1util_1_1Shared__name.html#a0bccc73c9c5b4f3b784a1e57cdc5c910">ipc::util::Shared_name::native_str</a></div><div class="ttdeci">const char * native_str() const</div><div class="ttdoc">Returns (sans copying) pointer to NUL-terminated wrapped name string, suitable to pass into sys calls...</div><div class="ttdef"><b>Definition:</b> <a href="shared__name_8cpp_source.html#l00145">shared_name.cpp:145</a></div></div>
<div class="ttc" id="aclassipc_1_1util_1_1Shared__name_html_a48f20b7b54490aa10dc64081d34c55b2"><div class="ttname"><a href="classipc_1_1util_1_1Shared__name.html#a48f20b7b54490aa10dc64081d34c55b2">ipc::util::Shared_name::ct</a></div><div class="ttdeci">static Shared_name ct(const Source &amp;src)</div><div class="ttdoc">Copy-constructs from a char-sequence container (including string, util::String_view,...</div><div class="ttdef"><b>Definition:</b> <a href="shared__name_8hpp_source.html#l00674">shared_name.hpp:674</a></div></div>
<div class="ttc" id="aipc__core_2src_2ipc_2transport_2error_8hpp_html"><div class="ttname"><a href="ipc__core_2src_2ipc_2transport_2error_8hpp.html">error.hpp</a></div></div>
<div class="ttc" id="anamespaceipc_1_1transport_1_1error_html_adfef15ef4e76cc55d652fbd9c2797297a291f8a813c292ccdb475c345181653ac"><div class="ttname"><a href="namespaceipc_1_1transport_1_1error.html#adfef15ef4e76cc55d652fbd9c2797297a291f8a813c292ccdb475c345181653ac">ipc::transport::error::Code::S_INTERRUPTED</a></div><div class="ttdeci">@ S_INTERRUPTED</div><div class="ttdoc">A blocking operation was intentionally interrupted or preemptively canceled.</div></div>
<div class="ttc" id="anamespaceipc_1_1transport_1_1error_html_adfef15ef4e76cc55d652fbd9c2797297a515698d19c829006a0803477fb605ae3"><div class="ttname"><a href="namespaceipc_1_1transport_1_1error.html#adfef15ef4e76cc55d652fbd9c2797297a515698d19c829006a0803477fb605ae3">ipc::transport::error::Code::S_MQ_BIPC_MISC_LIBRARY_ERROR</a></div><div class="ttdeci">@ S_MQ_BIPC_MISC_LIBRARY_ERROR</div><div class="ttdoc">Low-level message queue: boost.interprocess emitted miscellaneous library exception sans a system cod...</div></div>
<div class="ttc" id="anamespaceipc_1_1transport_1_1error_html_adfef15ef4e76cc55d652fbd9c2797297a9ee20939f859e44681c24f6d153cc36b"><div class="ttname"><a href="namespaceipc_1_1transport_1_1error.html#adfef15ef4e76cc55d652fbd9c2797297a9ee20939f859e44681c24f6d153cc36b">ipc::transport::error::Code::S_MQ_MESSAGE_SIZE_OVER_OR_UNDERFLOW</a></div><div class="ttdeci">@ S_MQ_MESSAGE_SIZE_OVER_OR_UNDERFLOW</div><div class="ttdoc">Low-level message queue send-op buffer overflow (&gt; max size) or receive-op buffer underflow (&lt; max si...</div></div>
<div class="ttc" id="anamespaceipc_1_1transport_html"><div class="ttname"><a href="namespaceipc_1_1transport.html">ipc::transport</a></div><div class="ttdoc">Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...</div><div class="ttdef"><b>Definition:</b> <a href="asio__local__stream__socket_8cpp_source.html#l00031">asio_local_stream_socket.cpp:32</a></div></div>
<div class="ttc" id="anamespaceipc_1_1transport_html_a33de1c256addb3964b839dc2dd407d24"><div class="ttname"><a href="namespaceipc_1_1transport.html#a33de1c256addb3964b839dc2dd407d24">ipc::transport::Shared_name</a></div><div class="ttdeci">util::Shared_name Shared_name</div><div class="ttdoc">Convenience alias for the commonly used type util::Shared_name.</div><div class="ttdef"><b>Definition:</b> <a href="transport__fwd_8hpp_source.html#l00084">transport_fwd.hpp:84</a></div></div>
<div class="ttc" id="anamespaceipc_1_1transport_html_a61c80019823537694f925275dccb4f3f"><div class="ttname"><a href="namespaceipc_1_1transport.html#a61c80019823537694f925275dccb4f3f">ipc::transport::operator&lt;&lt;</a></div><div class="ttdeci">std::ostream &amp; operator&lt;&lt;(std::ostream &amp;os, const Bipc_mq_handle &amp;val)</div><div class="ttdoc">Prints string representation of the given Bipc_mq_handle to the given ostream.</div><div class="ttdef"><b>Definition:</b> <a href="bipc__mq__handle_8cpp_source.html#l01028">bipc_mq_handle.cpp:1028</a></div></div>
<div class="ttc" id="anamespaceipc_1_1transport_html_af0610dff5efd418a8ff393f0ad9dd5c2"><div class="ttname"><a href="namespaceipc_1_1transport.html#af0610dff5efd418a8ff393f0ad9dd5c2">ipc::transport::swap</a></div><div class="ttdeci">void swap(Bipc_mq_handle &amp;val1, Bipc_mq_handle &amp;val2)</div><div class="ttdoc">Implements Persistent_mq_handle related concept: Swaps two objects.</div><div class="ttdef"><b>Definition:</b> <a href="bipc__mq__handle_8cpp_source.html#l00130">bipc_mq_handle.cpp:130</a></div></div>
<div class="ttc" id="anamespaceipc_1_1util_html_a1b398ae730d1e6040687cb2397115152"><div class="ttname"><a href="namespaceipc_1_1util.html#a1b398ae730d1e6040687cb2397115152">ipc::util::Permissions</a></div><div class="ttdeci">bipc::permissions Permissions</div><div class="ttdoc">Short-hand for Unix (POSIX) permissions class.</div><div class="ttdef"><b>Definition:</b> <a href="util__fwd_8hpp_source.html#l00161">util_fwd.hpp:161</a></div></div>
<div class="ttc" id="anamespaceipc_1_1util_html_a2bb38cee29dacbe56de5182221b45941"><div class="ttname"><a href="namespaceipc_1_1util.html#a2bb38cee29dacbe56de5182221b45941">ipc::util::blob_data</a></div><div class="ttdeci">const uint8_t * blob_data(const Blob_const &amp;blob)</div><div class="ttdoc">Syntactic-sugary helper that returns pointer to first byte in an immutable buffer,...</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2util_2util_8cpp_source.html#l00158">util.cpp:158</a></div></div>
<div class="ttc" id="anamespaceipc_1_1util_html_a3e03491b5b2b5fac26551a220946d6e5"><div class="ttname"><a href="namespaceipc_1_1util.html#a3e03491b5b2b5fac26551a220946d6e5">ipc::util::Open_only</a></div><div class="ttdeci">bipc::open_only_t Open_only</div><div class="ttdoc">Tag type indicating an ideally-atomic open-if-exists-else-fail operation.</div><div class="ttdef"><b>Definition:</b> <a href="util__fwd_8hpp_source.html#l00155">util_fwd.hpp:155</a></div></div>
<div class="ttc" id="anamespaceipc_1_1util_html_a5664539b3d75d6d10cdfebf6eac5382d"><div class="ttname"><a href="namespaceipc_1_1util.html#a5664539b3d75d6d10cdfebf6eac5382d">ipc::util::OPEN_OR_CREATE</a></div><div class="ttdeci">const Open_or_create OPEN_OR_CREATE</div><div class="ttdoc">Tag value indicating an open-if-exists-else-create operation.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2util_2util_8cpp_source.html#l00030">util.cpp:30</a></div></div>
<div class="ttc" id="anamespaceipc_1_1util_html_a6a3a6ec85242d073df96978c63464078"><div class="ttname"><a href="namespaceipc_1_1util.html#a6a3a6ec85242d073df96978c63464078">ipc::util::OPEN_ONLY</a></div><div class="ttdeci">const Open_only OPEN_ONLY</div><div class="ttdoc">Tag value indicating an atomic open-if-exists-else-fail operation.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2util_2util_8cpp_source.html#l00031">util.cpp:31</a></div></div>
<div class="ttc" id="anamespaceipc_1_1util_html_a6cb62ae434900f3a8915b33ec5d61a96"><div class="ttname"><a href="namespaceipc_1_1util.html#a6cb62ae434900f3a8915b33ec5d61a96">ipc::util::Blob_mutable</a></div><div class="ttdeci">boost::asio::mutable_buffer Blob_mutable</div><div class="ttdoc">Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.</div><div class="ttdef"><b>Definition:</b> <a href="util__fwd_8hpp_source.html#l00140">util_fwd.hpp:140</a></div></div>
<div class="ttc" id="anamespaceipc_1_1util_html_a9571de958538d7a4a8649bbfecfac0b9"><div class="ttname"><a href="namespaceipc_1_1util.html#a9571de958538d7a4a8649bbfecfac0b9">ipc::util::Open_or_create</a></div><div class="ttdeci">bipc::open_or_create_t Open_or_create</div><div class="ttdoc">Tag type indicating an atomic open-if-exists-else-create operation.</div><div class="ttdef"><b>Definition:</b> <a href="util__fwd_8hpp_source.html#l00152">util_fwd.hpp:152</a></div></div>
<div class="ttc" id="anamespaceipc_1_1util_html_a9d84c2bab504e6de32b20c77ca9723a2"><div class="ttname"><a href="namespaceipc_1_1util.html#a9d84c2bab504e6de32b20c77ca9723a2">ipc::util::Create_only</a></div><div class="ttdeci">bipc::create_only_t Create_only</div><div class="ttdoc">Tag type indicating a create-unless-exists-else-fail operation.</div><div class="ttdef"><b>Definition:</b> <a href="util__fwd_8hpp_source.html#l00158">util_fwd.hpp:158</a></div></div>
<div class="ttc" id="anamespaceipc_1_1util_html_aa3808edfc4d59bce4b9800d6a60026d3"><div class="ttname"><a href="namespaceipc_1_1util.html#aa3808edfc4d59bce4b9800d6a60026d3">ipc::util::Fine_time_pt</a></div><div class="ttdeci">flow::Fine_time_pt Fine_time_pt</div><div class="ttdoc">Short-hand for Flow's Fine_time_pt.</div><div class="ttdef"><b>Definition:</b> <a href="util__fwd_8hpp_source.html#l00119">util_fwd.hpp:119</a></div></div>
<div class="ttc" id="anamespaceipc_1_1util_html_ac66141280c3b7295a86b65209f31cc58"><div class="ttname"><a href="namespaceipc_1_1util.html#ac66141280c3b7295a86b65209f31cc58">ipc::util::Fine_duration</a></div><div class="ttdeci">flow::Fine_duration Fine_duration</div><div class="ttdoc">Short-hand for Flow's Fine_duration.</div><div class="ttdef"><b>Definition:</b> <a href="util__fwd_8hpp_source.html#l00117">util_fwd.hpp:117</a></div></div>
<div class="ttc" id="anamespaceipc_1_1util_html_ad1ca1cab79a35e1eb1c47037a0973cd8"><div class="ttname"><a href="namespaceipc_1_1util.html#ad1ca1cab79a35e1eb1c47037a0973cd8">ipc::util::CREATE_ONLY</a></div><div class="ttdeci">const Create_only CREATE_ONLY</div><div class="ttdoc">Tag value indicating an atomic create-unless-exists-else-fail operation.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2util_2util_8cpp_source.html#l00032">util.cpp:32</a></div></div>
<div class="ttc" id="anamespaceipc_1_1util_html_ae0be7edba7e30ffa3f8b742af621f2ab"><div class="ttname"><a href="namespaceipc_1_1util.html#ae0be7edba7e30ffa3f8b742af621f2ab">ipc::util::Blob_const</a></div><div class="ttdeci">boost::asio::const_buffer Blob_const</div><div class="ttdoc">Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.</div><div class="ttdef"><b>Definition:</b> <a href="util__fwd_8hpp_source.html#l00134">util_fwd.hpp:134</a></div></div>
<div class="ttc" id="anamespaceipc_1_1util_html_ae6ac47812a90d1287c61e0b7de7bc4f5"><div class="ttname"><a href="namespaceipc_1_1util.html#ae6ac47812a90d1287c61e0b7de7bc4f5">ipc::util::String_view</a></div><div class="ttdeci">flow::util::String_view String_view</div><div class="ttdoc">Short-hand for Flow's String_view.</div><div class="ttdef"><b>Definition:</b> <a href="util__fwd_8hpp_source.html#l00115">util_fwd.hpp:115</a></div></div>
<div class="ttc" id="anamespaceipc_html_a4ccdeed058222c635745a4dc830e99f7"><div class="ttname"><a href="namespaceipc.html#a4ccdeed058222c635745a4dc830e99f7">ipc::Log_component</a></div><div class="ttdeci">Log_component</div><div class="ttdoc">The flow::log::Component payload enumeration containing various log components used by Flow-IPC inter...</div><div class="ttdef"><b>Definition:</b> <a href="common_8hpp_source.html#l00322">common.hpp:323</a></div></div>
<div class="ttc" id="anamespaceipc_html_aa3192e586cc45d3e7c22463bf2760f89"><div class="ttname"><a href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">ipc::Error_code</a></div><div class="ttdeci">flow::Error_code Error_code</div><div class="ttdoc">Short-hand for flow::Error_code which is very common.</div><div class="ttdef"><b>Definition:</b> <a href="common_8hpp_source.html#l00298">common.hpp:298</a></div></div>
<div class="ttc" id="atransport__fwd_8hpp_html"><div class="ttname"><a href="transport__fwd_8hpp.html">transport_fwd.hpp</a></div></div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Fri Apr 11 2025 20:02:25 for Flow-IPC by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4
</small></address>
</body>
</html>
